1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-11 07:51:20 +00:00

Resolve "Audit log"

This commit is contained in:
Davide Silvestri 2023-01-16 14:40:12 +00:00
parent 0379894d1d
commit bab7cc44a1
192 changed files with 13407 additions and 737 deletions
.env.example
backend/src/baserow
api
config/settings
contrib/database
core
locale
cs/LC_MESSAGES
de/LC_MESSAGES

View file

@ -116,3 +116,6 @@ DATABASE_NAME=baserow
# BASEROW_ACCESS_TOKEN_LIFETIME_MINUTES=
# BASEROW_REFRESH_TOKEN_LIFETIME_HOURS=
# BASEROW_ENTERPRISE_AUDIT_LOG_CLEANUP_INTERVAL_MINUTES=
# BASEROW_ENTERPRISE_AUDIT_LOG_RETENTION_DAYS=

View file

@ -29,3 +29,8 @@ ERROR_INVALID_SORT_ATTRIBUTE = (
HTTP_400_BAD_REQUEST,
"Invalid attribute name provided to sort by.",
)
ERROR_INVALID_FILTER_ATTRIBUTE = (
"ERROR_INVALID_FILTER_ATTRIBUTE",
HTTP_400_BAD_REQUEST,
"Invalid attribute name provided to filter by.",
)

View file

@ -55,3 +55,9 @@ class InvalidSortAttributeException(Exception):
"""
Raised when a sort is requested for an invalid or non-existent field.
"""
class InvalidFilterAttributeException(Exception):
"""
Raised when a filter is requested for an invalid or non-existent field.
"""

55
backend/src/baserow/api/mixins.py Normal file → Executable file
View file

@ -1,8 +1,10 @@
import json
from typing import Dict, List, Union
from django.db.models import Q, QuerySet
from django.db.models import Q, QuerySet, Value
from baserow.api.exceptions import (
InvalidFilterAttributeException,
InvalidSortAttributeException,
InvalidSortDirectionException,
UnknownFieldProvided,
@ -92,7 +94,7 @@ class SearchableViewMixin:
q = Q()
for search_field in self.search_fields:
q.add(Q(**{f"{search_field}__icontains": search}), Q.OR)
q.add(Q(**{f"{search_field}__icontains": Value(search)}), Q.OR)
return queryset.filter(q)
@ -102,6 +104,7 @@ class SortableViewMixin:
# It's a mapping from the field name in the request to teh field name in the
# database.
sort_field_mapping: Dict[str, str] = {}
default_order_by: str = "id"
def apply_sorts_or_default_sort(
self, sorts: Union[str, None], queryset: QuerySet
@ -121,7 +124,7 @@ class SortableViewMixin:
"""
if sorts is None:
return queryset.order_by("id")
return queryset.order_by(self.default_order_by)
parsed_django_order_bys = []
already_seen_sorts = set()
@ -151,3 +154,49 @@ class SortableViewMixin:
parsed_django_order_bys.append(f"{direction}{attribute}")
return queryset.order_by(*parsed_django_order_bys)
class FilterableViewMixin:
filters_field_mapping: Dict[str, str] = {}
def parse_filters(self, unparsed_filters: str) -> Dict[str, str]:
"""
Parses the filters query string into a dictionary. The filters query string
is JSON encoded dictionary. The key is the field name and
the value is the field value that the field should have.
:param unparsed_filters: The filters query string.
:return: The filters query string parsed into a dictionary.
"""
if unparsed_filters:
try:
return json.loads(unparsed_filters)
except json.JSONDecodeError:
raise InvalidFilterAttributeException()
else:
return {}
def apply_filters(self, filters: Dict[str, str], queryset: QuerySet) -> QuerySet:
"""
Applies the provided filters to the provided query. If the filters are
provided then an `exact` lookup will be done for each field in the
filters_fields property. One of the fields has to match the query.
:param filters: The filters query.
:param queryset: The queryset where the filters query must be applied to.
:return: The queryset filtering the results by the filters query.
"""
if not filters:
return queryset
q = Q()
for key, value in filters.items():
if key in self.filters_field_mapping:
q.add(Q(**{f"{self.filters_field_mapping[key]}": Value(value)}), Q.AND)
else:
raise InvalidFilterAttributeException()
return queryset.filter(q)

View file

@ -91,6 +91,18 @@ def set_user_websocket_id(user, request):
user.web_socket_id = request.headers.get(settings.WEBSOCKET_ID_HEADER)
def set_user_remote_addr_ip_from_request(user, request):
set_user_remote_addr_ip(user, request.META.get("REMOTE_ADDR"))
def set_user_remote_addr_ip(user, ip_address):
user.remote_addr_ip = ip_address
def get_user_remote_addr_ip(user):
return getattr(user, "remote_addr_ip", None)
def set_user_session_data_from_request(user, request):
"""
Sets the user data from the request. This includes the websocket id, the
@ -103,3 +115,4 @@ def set_user_session_data_from_request(user, request):
set_user_websocket_id(user, request)
set_untrusted_client_session_id_from_request_or_raise_if_invalid(user, request)
set_client_undo_redo_action_group_id_from_request_or_raise_if_invalid(user, request)
set_user_remote_addr_ip_from_request(user, request)

View file

@ -14,7 +14,7 @@ urlpatterns = [
re_path(
r"(?P<snapshot_id>[0-9]+)/$",
SnapshotView.as_view(),
name="detail",
name="item",
),
re_path(
r"(?P<snapshot_id>[0-9]+)/restore/$",

View file

@ -4,6 +4,7 @@ from drf_spectacular.openapi import OpenApiParameter, OpenApiTypes
from drf_spectacular.utils import extend_schema
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.status import HTTP_202_ACCEPTED
from rest_framework.views import APIView
from baserow.api.applications.errors import (
@ -23,12 +24,14 @@ from baserow.api.snapshots.errors import (
ERROR_SNAPSHOT_NAME_NOT_UNIQUE,
ERROR_SNAPSHOT_OPERATION_LIMIT_EXCEEDED,
)
from baserow.core.action.registries import action_type_registry
from baserow.core.exceptions import (
ApplicationDoesNotExist,
ApplicationOperationNotSupported,
UserNotInGroup,
)
from baserow.core.jobs.exceptions import MaxJobCountExceeded
from baserow.core.snapshots.actions import DeleteSnapshotActionType
from baserow.core.snapshots.exceptions import (
MaximumSnapshotsReached,
SnapshotDoesNotExist,
@ -99,7 +102,7 @@ class SnapshotsView(APIView):
),
request=SnapshotSerializer,
responses={
200: JobSerializer,
202: JobSerializer,
400: get_error_schema(
[
"ERROR_USER_NOT_IN_GROUP",
@ -134,7 +137,7 @@ class SnapshotsView(APIView):
handler = SnapshotHandler()
snapshot_created = handler.create(application_id, request.user, data["name"])
serializer = JobSerializer(snapshot_created["job"])
return Response(serializer.data)
return Response(serializer.data, status=HTTP_202_ACCEPTED)
class RestoreSnapshotView(APIView):
@ -248,6 +251,7 @@ class SnapshotView(APIView):
Deletes a given application snapshot.
"""
handler = SnapshotHandler()
handler.delete(snapshot_id, request.user)
action_type_registry.get(DeleteSnapshotActionType.type).do(
request.user, snapshot_id
)
return Response(status=204)

View file

@ -35,7 +35,7 @@ from baserow.api.schemas import get_error_schema
from baserow.api.sessions import get_untrusted_client_session_id
from baserow.api.user.registries import user_data_registry
from baserow.core.action.handler import ActionHandler
from baserow.core.action.registries import ActionScopeStr
from baserow.core.action.registries import ActionScopeStr, action_type_registry
from baserow.core.auth_provider.exceptions import AuthProviderDisabled
from baserow.core.auth_provider.handler import PasswordProviderHandler
from baserow.core.exceptions import (
@ -45,6 +45,11 @@ from baserow.core.exceptions import (
LockConflict,
)
from baserow.core.models import GroupInvitation, Template
from baserow.core.user.actions import (
CreateUserActionType,
ScheduleUserDeletionActionType,
UpdateUserActionType,
)
from baserow.core.user.exceptions import (
DeactivatedUserException,
DisabledSignupError,
@ -222,7 +227,7 @@ class UserView(APIView):
else None
)
user = UserHandler().create_user(
user = action_type_registry.get(CreateUserActionType.type).do(
name=data["name"],
email=data["email"],
password=data["password"],
@ -407,9 +412,8 @@ class AccountView(APIView):
def patch(self, request, data):
"""Updates editable user account information."""
user = UserHandler().update_user(
request.user,
**data,
user = action_type_registry.get(UpdateUserActionType.type).do(
request.user, **data
)
return Response(AccountSerializer(user).data)
@ -443,7 +447,7 @@ class ScheduleAccountDeletionView(APIView):
def post(self, request):
"""Schedules user account deletion."""
UserHandler().schedule_user_deletion(request.user)
action_type_registry.get(ScheduleUserDeletionActionType.type).do(request.user)
return Response(status=204)

View file

@ -285,6 +285,7 @@ def get_serializer_class(
base_class=None,
meta_ref_name=None,
required_fields=None,
base_mixins=None,
):
"""
Generates a model serializer based on the provided field names and field overrides.
@ -304,6 +305,8 @@ def get_serializer_class(
:param required_fields: List of field names that should be present even when
performing partial validation.
:type required_fields: list[str]
:param mixins: An optional list of mixins that must be added to the serializer.
:type base_mixins: list[serializers.Serializer]
:return: The generated model serializer containing the provided fields.
:rtype: ModelSerializer
"""
@ -349,7 +352,15 @@ def get_serializer_class(
return value
attrs["validate"] = validate
return type(str(model_.__name__ + "Serializer"), (base_class,), attrs)
mixins = base_mixins or []
return type(
str(model_.__name__ + "Serializer"),
(
*mixins,
base_class,
),
attrs,
)
class MappingSerializer:

View file

@ -1,5 +1,6 @@
import datetime
import importlib
import logging
import os
import re
from decimal import Decimal
@ -27,6 +28,7 @@ else:
BASEROW_PLUGIN_FOLDERS = []
BASEROW_BACKEND_PLUGIN_NAMES = [d.name for d in BASEROW_PLUGIN_FOLDERS]
BASEROW_BUILT_IN_PLUGINS = ["baserow_premium", "baserow_enterprise"]
# SECURITY WARNING: keep the secret key used in production secret!
if "SECRET_KEY" in os.environ:
@ -59,8 +61,7 @@ INSTALLED_APPS = [
"baserow.api",
"baserow.ws",
"baserow.contrib.database",
"baserow_premium",
"baserow_enterprise",
*BASEROW_BUILT_IN_PLUGINS,
]
BASEROW_FULL_HEALTHCHECKS = os.getenv("BASEROW_FULL_HEALTHCHECKS", None)
@ -763,10 +764,10 @@ class AttrDict(dict):
return super().__getitem__(item)
def __setattr__(self, item, value):
return super().__setitem__(item, value)
globals()[item] = value
for plugin in BASEROW_BACKEND_PLUGIN_NAMES:
for plugin in [*BASEROW_BUILT_IN_PLUGINS, *BASEROW_BACKEND_PLUGIN_NAMES]:
try:
mod = importlib.import_module(plugin + ".config.settings.settings")
# The plugin should have a setup function which accepts a 'settings' object.
@ -774,4 +775,5 @@ for plugin in BASEROW_BACKEND_PLUGIN_NAMES:
# plugin can access the Django settings and modify them prior to startup.
result = mod.setup(AttrDict(vars()))
except ImportError:
pass
logger = logging.getLogger(__name__)
logger.warning("Could not import %s", plugin)

17
backend/src/baserow/contrib/database/action/scopes.py Normal file → Executable file
View file

@ -1,9 +1,26 @@
from typing import Optional, cast
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from baserow.core.action.registries import ActionScopeStr, ActionScopeType
DATABASE_ACTION_CONTEXT = _('in database "%(database_name)s" (%(database_id)s).')
TABLE_ACTION_CONTEXT = _(
'in table "%(table_name)s" (%(table_id)s) '
'of database "%(database_name)s" (%(database_id)s).'
)
VIEW_ACTION_CONTEXT = _(
'in view "%(view_name)s" (%(view_id)s) '
'of table "%(table_name)s" (%(table_id)s) '
'in database "%(database_name)s" (%(database_id)s).'
)
class TableActionScopeType(ActionScopeType):
type = "table"

View file

@ -329,25 +329,26 @@ class CreateViewSerializer(serializers.ModelSerializer):
class UpdateViewSerializer(serializers.ModelSerializer):
def _update_public_view_password(self, new_public_view_password):
def _make_password(self, plain_password: str):
"""
An empty string disables password protection.
A non-empty string will be encrypted and used to check user authorization.
:param plain_password: The password to encrypt.
:return: The encrypted password or "" if disabled.
"""
if new_public_view_password:
return View.make_password(new_public_view_password)
else:
return ""
return View.make_password(plain_password) if plain_password else ""
def to_internal_value(self, data):
public_view_password = data.pop("public_view_password", None)
updated_view = super().to_internal_value(data)
if public_view_password is not None:
updated_view["public_view_password"] = self._update_public_view_password(
public_view_password
)
return updated_view
plain_password = data.get("public_view_password")
if plain_password is not None:
data = {
**data,
"public_view_password": self._make_password(plain_password),
}
return super().to_internal_value(data)
class Meta:
ref_name = "view_update"

View file

@ -608,11 +608,7 @@ class DuplicateViewView(APIView):
200: DiscriminatorCustomFieldsMappingSerializer(
view_type_registry, ViewSerializer
),
400: get_error_schema(
[
"ERROR_USER_NOT_IN_GROUP",
]
),
400: get_error_schema(["ERROR_USER_NOT_IN_GROUP"]),
404: get_error_schema(["ERROR_VIEW_DOES_NOT_EXIST"]),
},
)

180
backend/src/baserow/contrib/database/fields/actions.py Normal file → Executable file
View file

@ -1,9 +1,15 @@
import dataclasses
from copy import deepcopy
from typing import Any, Dict, List, Optional, Set, Tuple, Union
from uuid import uuid4
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.contrib.database.action.scopes import (
TABLE_ACTION_CONTEXT,
TableActionScopeType,
)
from baserow.contrib.database.fields.backup_handler import (
BackupData,
FieldDataBackupHandler,
@ -12,28 +18,45 @@ from baserow.contrib.database.fields.handler import FieldHandler
from baserow.contrib.database.fields.models import Field, SpecificFieldForUpdate
from baserow.contrib.database.fields.registries import field_type_registry
from baserow.contrib.database.table.models import Table
from baserow.contrib.database.table.scopes import TableActionScopeType
from baserow.core.action.models import Action
from baserow.core.action.registries import ActionScopeStr, ActionType
from baserow.core.action.registries import (
ActionScopeStr,
ActionTypeDescription,
UndoableActionCustomCleanupMixin,
UndoableActionType,
)
from baserow.core.trash.handler import TrashHandler
from baserow.core.utils import ChildProgressBuilder
class UpdateFieldActionType(ActionType):
class UpdateFieldActionType(UndoableActionCustomCleanupMixin, UndoableActionType):
type = "update_field"
description = ActionTypeDescription(
_("Update field"),
_('Field "%(field_name)s" (%(field_id)s) updated'),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
field_id: int
field_name: str
field_type: str
# We also need to persist the actual name of the database table in-case the
# field itself is perm deleted by the time we clean up we can still find the
# table and delete the column if need be.
database_table_name: str
previous_field_type: str
previous_field_params: Dict[str, Any]
original_field_type: str
original_field_params: Dict[str, Any]
backup_data: Optional[Dict[str, Any]]
backup_uid: Optional[str] = None
@classmethod
def do(
@ -62,34 +85,36 @@ class UpdateFieldActionType(ActionType):
from_field_type_name = from_field_type.type
to_field_type_name = new_type_name or from_field_type_name
backup_uuid = str(uuid4()).replace("-", "")
original_exported_values = cls._get_prepared_field_attrs(
field, kwargs, to_field_type_name
)
# We initially create the action with blank params so we have an action id
# to use when naming a possible backup field/table.
action = cls.register_action(user, {}, cls.scope(field.table_id))
optional_backup_data = cls._backup_field_if_required(
field, kwargs, action, to_field_type_name, False
field, kwargs, to_field_type_name, backup_uuid
)
field, updated_fields = FieldHandler().update_field(
user,
field,
new_type_name,
return_updated_fields=True,
**kwargs,
user, field, new_type_name, return_updated_fields=True, **kwargs
)
action.params = cls.Params(
field_id=field.id,
table = field.table
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
field.id,
field.name,
to_field_type_name,
database_table_name=field.table.get_database_table_name(),
previous_field_type=from_field_type_name,
previous_field_params=original_exported_values,
original_field_type=from_field_type_name,
original_field_params=original_exported_values,
backup_data=optional_backup_data,
backup_uid=backup_uuid,
)
action.save()
group = table.database.group
cls.register_action(user, params, cls.scope(table.id), group)
return field, updated_fields
@ -122,18 +147,18 @@ class UpdateFieldActionType(ActionType):
@classmethod
def clean_up_any_extra_action_data(cls, action_being_cleaned_up: Action):
params = cls.Params(**action_being_cleaned_up.params)
if params.backup_data is not None:
FieldDataBackupHandler.clean_up_backup_data(params.backup_data)
backup_data = action_being_cleaned_up.params.get("backup_data")
if backup_data is not None:
FieldDataBackupHandler.clean_up_backup_data(backup_data)
@classmethod
def _backup_field_if_required(
cls,
original_field: Field,
allowed_new_field_attrs: Dict[str, Any],
action: Action,
to_field_type_name: str,
for_undo: bool,
backup_uuid: str,
for_undo: bool = False,
) -> Optional[BackupData]:
"""
Performs a backup if needed and returns a dictionary of backup data which can
@ -147,7 +172,7 @@ class UpdateFieldActionType(ActionType):
backup_data = FieldDataBackupHandler.backup_field_data(
original_field,
identifier_to_backup_into=cls._get_backup_identifier(
action, original_field.id, for_undo=for_undo
original_field.id, backup_uuid, for_undo=for_undo
),
)
else:
@ -218,14 +243,14 @@ class UpdateFieldActionType(ActionType):
@classmethod
def _get_backup_identifier(
cls, action: Action, field_id: int, for_undo: bool
cls, field_id: int, backup_uuid: str, for_undo: bool
) -> str:
"""
Returns a column/table name unique to this action and field which can be
used to safely store backup data in the database.
"""
base_name = f"field_{field_id}_backup_{action.id}"
base_name = f"field_{field_id}_backup_{backup_uuid}"
if for_undo:
# When undoing we need to backup into a different column/table so we
# don't accidentally overwrite the data we are about to restore using.
@ -241,21 +266,22 @@ class UpdateFieldActionType(ActionType):
params: Params,
for_undo: bool,
):
new_field_attributes = deepcopy(params.previous_field_params)
to_field_type_name = params.previous_field_type
new_field_attributes = deepcopy(params.original_field_params)
to_field_type_name = params.original_field_type
handler = FieldHandler()
field = handler.get_specific_field_for_update(params.field_id)
updated_field_attrs = set(new_field_attributes.keys())
previous_field_params = cls._get_prepared_field_attrs(
original_field_params = cls._get_prepared_field_attrs(
field, updated_field_attrs, to_field_type_name
)
from_field_type = field_type_registry.get_by_model(field)
from_field_type_name = from_field_type.type
backup_uid = params.backup_uid or action.id
optional_backup_data = cls._backup_field_if_required(
field, new_field_attributes, action, to_field_type_name, for_undo
field, new_field_attributes, to_field_type_name, backup_uid, for_undo
)
def after_field_schema_change_callback(
@ -288,17 +314,28 @@ class UpdateFieldActionType(ActionType):
)
params.backup_data = optional_backup_data
params.previous_field_type = from_field_type_name
params.previous_field_params = previous_field_params
params.original_field_type = from_field_type_name
params.original_field_params = original_field_params
action.params = params
class CreateFieldActionType(ActionType):
class CreateFieldActionType(UndoableActionType):
type = "create_field"
description = ActionTypeDescription(
_("Create field"),
_('Field "%(field_name)s" (%(field_id)s) created'),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
field_id: int
field_name: str
field_type: str
@classmethod
def do(
@ -347,9 +384,17 @@ class CreateFieldActionType(ActionType):
field = result
updated_fields = None
cls.register_action(
user=user, params=cls.Params(field_id=field.id), scope=cls.scope(table.id)
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
field.id,
field.name,
type_name,
)
group = table.database.group
cls.register_action(user, params, cls.scope(table.id), group)
return (field, updated_fields) if return_updated_fields else field
@ -367,12 +412,22 @@ class CreateFieldActionType(ActionType):
TrashHandler().restore_item(user, "field", params.field_id)
class DeleteFieldActionType(ActionType):
class DeleteFieldActionType(UndoableActionType):
type = "delete_field"
description = ActionTypeDescription(
_("Delete field"),
_('Field "%(field_name)s" (%(field_id)s) deleted'),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
field_id: int
field_name: str
@classmethod
def do(
@ -394,13 +449,17 @@ class DeleteFieldActionType(ActionType):
result = FieldHandler().delete_field(user, field)
cls.register_action(
user=user,
params=cls.Params(
field.id,
),
scope=cls.scope(field.table_id),
table = field.table
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
field.id,
field.name,
)
cls.register_action(user, params, cls.scope(table.id), group)
return result
@ -421,12 +480,28 @@ class DeleteFieldActionType(ActionType):
)
class DuplicateFieldActionType(ActionType):
class DuplicateFieldActionType(UndoableActionType):
type = "duplicate_field"
description = ActionTypeDescription(
_("Duplicate field"),
_(
'Field "%(field_name)s" (%(field_id)s) duplicated (with_data=%(with_data)s) '
'from field "%(original_field_name)s" (%(original_field_id)s)'
),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
field_id: int
field_name: str
with_data: bool
original_field_id: int
original_field_name: str
@classmethod
def do(
@ -452,9 +527,20 @@ class DuplicateFieldActionType(ActionType):
new_field_clone, updated_fields = FieldHandler().duplicate_field(
user, field, duplicate_data, progress_builder=progress_builder
)
cls.register_action(
user, cls.Params(new_field_clone.id), cls.scope(field.table_id)
table = field.table
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
new_field_clone.id,
new_field_clone.name,
duplicate_data,
field.id,
field.name,
)
group = table.database.group
cls.register_action(user, params, cls.scope(field.table_id), group)
return new_field_clone, updated_fields
@classmethod

View file

@ -19,7 +19,11 @@ from baserow.contrib.database.formula import (
)
from baserow.contrib.database.mixins import ParentFieldTrashableModelMixin
from baserow.contrib.database.table.cache import invalidate_table_in_model_cache
from baserow.core.jobs.mixins import JobWithUndoRedoIds, JobWithWebsocketId
from baserow.core.jobs.mixins import (
JobWithUndoRedoIds,
JobWithUserIpAddress,
JobWithWebsocketId,
)
from baserow.core.jobs.models import Job
from baserow.core.mixins import (
CreatedAndUpdatedOnMixin,
@ -535,7 +539,9 @@ class MultipleCollaboratorsField(Field):
return f"{self.THROUGH_DATABASE_TABLE_PREFIX}{self.id}"
class DuplicateFieldJob(JobWithWebsocketId, JobWithUndoRedoIds, Job):
class DuplicateFieldJob(
JobWithUserIpAddress, JobWithWebsocketId, JobWithUndoRedoIds, Job
):
original_field = models.ForeignKey(
Field,

View file

@ -2,7 +2,11 @@ from django.db import models
from baserow.contrib.database.models import Database
from baserow.contrib.database.table.models import Table
from baserow.core.jobs.mixins import JobWithUndoRedoIds, JobWithWebsocketId
from baserow.core.jobs.mixins import (
JobWithUndoRedoIds,
JobWithUserIpAddress,
JobWithWebsocketId,
)
from baserow.core.jobs.models import Job
@ -20,7 +24,7 @@ def default_report():
return {"failing_rows": {}}
class FileImportJob(JobWithWebsocketId, JobWithUndoRedoIds, Job):
class FileImportJob(JobWithUserIpAddress, JobWithWebsocketId, JobWithUndoRedoIds, Job):
database = models.ForeignKey(
Database,

Binary file not shown.

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-03-26 23:23+0000\n"
"Last-Translator: Petr S. <petr@stribny.name>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/baserow/backend-"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.12-dev\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr ""
#~ msgid "Customers"
#~ msgstr "Zákazníci"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Zákazníci"
#~ msgid "Grid"
#~ msgstr "Mřížka"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "Projekty"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Projekty"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Mřížka"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

Binary file not shown.

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:45+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-02-02 19:53+0000\n"
"Last-Translator: Natthapon <natthapon@wagner-international.com>\n"
"Language-Team: German <https://hosted.weblate.org/projects/baserow/backend-"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "%(first_name)s's Firma"
#~ msgid "Customers"
#~ msgstr "Kunden"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Kunden"
#~ msgid "Grid"
#~ msgstr "Gitter"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "Projekte"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Projekte"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Gitter"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-04 11:05+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,66 +18,390 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/baserow/contrib/database/plugins.py:41
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr ""
#: src/baserow/contrib/database/plugins.py:48
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr ""
#: src/baserow/contrib/database/plugins.py:50
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/table/handler.py:409
#: src/baserow/contrib/database/table/handler.py:422
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:51
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:52
#: src/baserow/contrib/database/table/handler.py:410
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:53
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:411
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:70
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr ""
#: src/baserow/contrib/database/plugins.py:73
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:79
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:80
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:81
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:82
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/table/handler.py:251
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr ""
#: src/baserow/contrib/database/table/handler.py:313
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

Binary file not shown.

View file

@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:45+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-05-05 23:14+0000\n"
"Last-Translator: Zuhair Rayyes <zuhair@baserow.io>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/baserow/"
"backend-database/es/>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/baserow/backend-"
"database/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12.1\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "Compañía de %(first_name)s"
#~ msgid "Customers"
#~ msgstr "Clientes"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Clientes"
#~ msgid "Grid"
#~ msgstr "Cuadrícula"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "Proyectos"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Proyectos"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Cuadrícula"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-04 11:06+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,66 +18,390 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/baserow/contrib/database/plugins.py:41
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "Entreprise de %(first_name)s"
#: src/baserow/contrib/database/plugins.py:48
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Clients"
#: src/baserow/contrib/database/plugins.py:50
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/table/handler.py:409
#: src/baserow/contrib/database/table/handler.py:422
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr "Nom"
#: src/baserow/contrib/database/plugins.py:51
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr "Nom de famille"
#: src/baserow/contrib/database/plugins.py:52
#: src/baserow/contrib/database/table/handler.py:410
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr "Notes"
#: src/baserow/contrib/database/plugins.py:53
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:411
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr "Actif"
#: src/baserow/contrib/database/plugins.py:70
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Projets"
#: src/baserow/contrib/database/plugins.py:73
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr "Début"
#: src/baserow/contrib/database/plugins.py:79
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr "Calculatrice"
#: src/baserow/contrib/database/plugins.py:80
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr "Machine de Turing"
#: src/baserow/contrib/database/plugins.py:81
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr "Architecture des ordinateur"
#: src/baserow/contrib/database/plugins.py:82
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr "Automate cellulaire"
#: src/baserow/contrib/database/table/handler.py:251
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Grille"
#: src/baserow/contrib/database/table/handler.py:313
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr "Colonne %d"
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

Binary file not shown.

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-03-17 14:56+0000\n"
"Last-Translator: Sara Cinacchi <sara.cinacchi@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/baserow/backend-"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12-dev\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "Azienda di %(first_name)s"
#~ msgid "Customers"
#~ msgstr "Clienti"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Clienti"
#~ msgid "Grid"
#~ msgstr "Griglia"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "Progetti"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Progetti"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Griglia"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-04 11:06+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-11-28 18:47+0000\n"
"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n"
"Language-Team: Marathi <https://hosted.weblate.org/projects/baserow/"
"backend-database/mr/>\n"
"Language-Team: Marathi <https://hosted.weblate.org/projects/baserow/backend-"
"database/mr/>\n"
"Language: mr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -19,66 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15-dev\n"
#: src/baserow/contrib/database/plugins.py:41
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "%(first_name)s ची कंपनी"
#: src/baserow/contrib/database/plugins.py:48
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "ग्राहक"
#: src/baserow/contrib/database/plugins.py:50
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/table/handler.py:409
#: src/baserow/contrib/database/table/handler.py:422
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr "नाव"
#: src/baserow/contrib/database/plugins.py:51
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr "आडनाव"
#: src/baserow/contrib/database/plugins.py:52
#: src/baserow/contrib/database/table/handler.py:410
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr "टीपा"
#: src/baserow/contrib/database/plugins.py:53
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:411
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr "सक्रिय"
#: src/baserow/contrib/database/plugins.py:70
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "प्रकल्प"
#: src/baserow/contrib/database/plugins.py:73
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr "सुरु झाले"
#: src/baserow/contrib/database/plugins.py:79
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr "कॅल्क्युलेटर"
#: src/baserow/contrib/database/plugins.py:80
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr "ट्युरिंग मशीन"
#: src/baserow/contrib/database/plugins.py:81
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr "संगणक आर्किटेक्चर"
#: src/baserow/contrib/database/plugins.py:82
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr "सेल्युलर ऑटोमेटा"
#: src/baserow/contrib/database/table/handler.py:251
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "ग्रिड"
#: src/baserow/contrib/database/table/handler.py:313
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr "फील्ड %d"
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

Binary file not shown.

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-01-30 00:54+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/baserow/"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "%(first_name)s sitt selskap"
#~ msgid "Customers"
#~ msgstr "Kunder"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Kunder"
#~ msgid "Grid"
#~ msgstr "Rutenett"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "Prosjekter"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Prosjekter"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Rutenett"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

Binary file not shown.

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:46+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-02-04 10:29+0000\n"
"Last-Translator: Cornelia Dieleman <financialswift@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/baserow/backend-"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "Het bedrijf van %(first_name)s"
#~ msgid "Customers"
#~ msgstr "Klanten"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Klanten"
#~ msgid "Grid"
#~ msgstr "Rooster"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "Projecten"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Projecten"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Rooster"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

View file

@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-04 11:06+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-08-11 12:21+0000\n"
"Last-Translator: PiotrEsse <piotr.esse@spero.click>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/baserow/"
"backend-database/pl/>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/baserow/backend-"
"database/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -20,66 +20,390 @@ msgstr ""
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.14-dev\n"
#: src/baserow/contrib/database/plugins.py:41
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "Firma %(first_name)s"
#: src/baserow/contrib/database/plugins.py:48
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Klienci"
#: src/baserow/contrib/database/plugins.py:50
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/table/handler.py:409
#: src/baserow/contrib/database/table/handler.py:422
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr "Nazwa"
#: src/baserow/contrib/database/plugins.py:51
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr "Nazwisko"
#: src/baserow/contrib/database/plugins.py:52
#: src/baserow/contrib/database/table/handler.py:410
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr "Notatki"
#: src/baserow/contrib/database/plugins.py:53
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:411
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr "Aktywny"
#: src/baserow/contrib/database/plugins.py:70
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Projekty"
#: src/baserow/contrib/database/plugins.py:73
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr "Rozpoczęto"
#: src/baserow/contrib/database/plugins.py:79
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr "Kalkulator"
#: src/baserow/contrib/database/plugins.py:80
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr "Maszyna Turinga"
#: src/baserow/contrib/database/plugins.py:81
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr "Architektura komputerów"
#: src/baserow/contrib/database/plugins.py:82
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr "Automaty komórkowe"
#: src/baserow/contrib/database/table/handler.py:251
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Siatka"
#: src/baserow/contrib/database/table/handler.py:313
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr "Pole %d"
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-28 20:39+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-21 19:14+0000\n"
"Last-Translator: James Braves <dubavy@zetmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
@ -19,20 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.12-dev\n"
#: src/baserow/contrib/database/plugins.py:44
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "%(first_name)s's companhia"
#: src/baserow/contrib/database/plugins.py:48
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "Clientes"
#: src/baserow/contrib/database/plugins.py:50
#: src/baserow/contrib/database/plugins.py:85
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "Projetos"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "Grade"
#: src/baserow/contrib/database/plugins.py:83
msgid "Projects"
msgstr "Projetos"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-04 11:06+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -18,66 +18,390 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: src/baserow/contrib/database/plugins.py:41
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr ""
#: src/baserow/contrib/database/plugins.py:48
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr ""
#: src/baserow/contrib/database/plugins.py:50
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/table/handler.py:409
#: src/baserow/contrib/database/table/handler.py:422
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:51
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:52
#: src/baserow/contrib/database/table/handler.py:410
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:53
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:411
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:70
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr ""
#: src/baserow/contrib/database/plugins.py:73
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:79
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:80
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:81
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:82
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/table/handler.py:251
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr ""
#: src/baserow/contrib/database/table/handler.py:313
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

Binary file not shown.

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-01-28 09:54+0000\n"
"Last-Translator: Joey Li <joeyli16@icloud.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
@ -19,16 +19,390 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.11-dev\n"
#: src/baserow/contrib/database/plugins.py:45
#: src/baserow/contrib/database/action/scopes.py:9
#, python-format
msgid "in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:13
#, python-format
msgid ""
"in table \"%(table_name)s\" (%(table_id)s) of database \"%(database_name)s"
"\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/action/scopes.py:19
#, python-format
msgid ""
"in view \"%(view_name)s\" (%(view_id)s) of table \"%(table_name)s"
"\" (%(table_id)s) in database \"%(database_name)s\" (%(database_id)s)."
msgstr ""
#: src/baserow/contrib/database/application_types.py:190
msgid "Table"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:35
msgid "Update field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:36
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:325
msgid "Create field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:326
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) created"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:418
msgid "Delete field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:419
#, python-format
msgid "Field \"%(field_name)s\" (%(field_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:486
msgid "Duplicate field"
msgstr ""
#: src/baserow/contrib/database/fields/actions.py:488
#, python-format
msgid ""
"Field \"%(field_name)s\" (%(field_id)s) duplicated (with_data=%(with_data)s) "
"from field \"%(original_field_name)s\" (%(original_field_id)s)"
msgstr ""
#: src/baserow/contrib/database/plugins.py:63
#, python-format
msgid "%(first_name)s's company"
msgstr "%(first_name)s 的公司"
#~ msgid "Customers"
#~ msgstr "客户"
#: src/baserow/contrib/database/plugins.py:70
msgid "Customers"
msgstr "客户"
#~ msgid "Grid"
#~ msgstr "表格"
#: src/baserow/contrib/database/plugins.py:72
#: src/baserow/contrib/database/plugins.py:94
#: src/baserow/contrib/database/table/handler.py:333
#: src/baserow/contrib/database/table/handler.py:346
msgid "Name"
msgstr ""
#~ msgid "Projects"
#~ msgstr "项目"
#: src/baserow/contrib/database/plugins.py:73
msgid "Last name"
msgstr ""
#: src/baserow/contrib/database/plugins.py:74
#: src/baserow/contrib/database/table/handler.py:334
msgid "Notes"
msgstr ""
#: src/baserow/contrib/database/plugins.py:75
#: src/baserow/contrib/database/plugins.py:96
#: src/baserow/contrib/database/table/handler.py:335
msgid "Active"
msgstr ""
#: src/baserow/contrib/database/plugins.py:92
msgid "Projects"
msgstr "项目"
#: src/baserow/contrib/database/plugins.py:95
msgid "Started"
msgstr ""
#: src/baserow/contrib/database/plugins.py:101
msgid "Calculator"
msgstr ""
#: src/baserow/contrib/database/plugins.py:102
msgid "Turing machine"
msgstr ""
#: src/baserow/contrib/database/plugins.py:103
msgid "Computer architecture"
msgstr ""
#: src/baserow/contrib/database/plugins.py:104
msgid "Cellular Automata"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
msgid "Create row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:33
#, python-format
msgid "Row (%(row_id)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
msgid "Create rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:111
#, python-format
msgid "Rows (%(row_ids)s) created"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
msgid "Import rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:190
#, python-format
msgid "Rows (%(row_ids)s) imported"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
msgid "Delete row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:272
#, python-format
msgid "Row (%(row_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
msgid "Delete rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:333
#, python-format
msgid "Rows (%(row_ids)s) deleted"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
msgid "Move row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:473
#, python-format
msgid "Row (%(row_id)s) moved"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
msgid "Update row"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:581
#, python-format
msgid "Row (%(row_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
msgid "Update rows"
msgstr ""
#: src/baserow/contrib/database/rows/actions.py:681
#, python-format
msgid "Rows (%(row_ids)s) updated"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:26
msgid "Create table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:27
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:100
msgid "Delete table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:101
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:150
msgid "Order tables"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:151
msgid "Tables order changed"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:210
msgid "Update table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:212
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""
#: src/baserow/contrib/database/table/actions.py:276
msgid "Duplicate table"
msgstr ""
#: src/baserow/contrib/database/table/actions.py:278
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
"\"%(original_table_name)s\" (%(original_table_id)s) "
msgstr ""
#: src/baserow/contrib/database/table/handler.py:237
msgid "Grid"
msgstr "表格"
#: src/baserow/contrib/database/table/handler.py:295
#, python-format
msgid "Field %d"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:39
msgid "Create a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:40
#, python-format
msgid "View filter created on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:133
msgid "Update a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:134
#, python-format
msgid "View filter updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:255
msgid "Delete a view filter"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:256
#, python-format
msgid "View filter deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:352
msgid "Create a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:353
#, python-format
msgid "View sorted on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:429
msgid "Update a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:430
#, python-format
msgid "View sort updated on field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:528
msgid "Delete a view sort"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:529
#, python-format
msgid "View sort deleted from field \"%(field_name)s\" (%(field_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Order views"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:606
msgid "Views order changed"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:669
msgid "Update view field options"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:670
msgid "ViewFieldOptions updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:765
msgid "View slug URL updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:766
msgid "View changed public slug URL"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:834
msgid "Update view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:835
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:919
msgid "Create view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:920
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:988
msgid "Duplicate view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:990
#, python-format
msgid ""
"View \"%(view_name)s\" (%(view_id)s) duplicated from view "
"\"%(original_view_name)s\" (%(original_view_id)s)"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1058
msgid "Delete view"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1059
#, python-format
msgid "View \"%(view_name)s\" (%(view_id)s) deleted"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1116
msgid "Create decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1117
#, python-format
msgid "View decoration %(decorator_id)s created"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1212
msgid "Update decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1213
#, python-format
msgid "View decoration %(decorator_id)s updated"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1337
msgid "Delete decoration"
msgstr ""
#: src/baserow/contrib/database/views/actions.py:1338
#, python-format
msgid "View decoration %(decorator_id)s deleted"
msgstr ""

View file

@ -0,0 +1,34 @@
# Generated by Django 3.2.13 on 2023-01-12 15:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("database", "0095_update_exportjob_data"),
]
operations = [
migrations.AddField(
model_name="duplicatefieldjob",
name="user_ip_address",
field=models.CharField(
help_text="The user IP address.", max_length=45, null=True
),
),
migrations.AddField(
model_name="duplicatetablejob",
name="user_ip_address",
field=models.CharField(
help_text="The user IP address.", max_length=45, null=True
),
),
migrations.AddField(
model_name="fileimportjob",
name="user_ip_address",
field=models.CharField(
help_text="The user IP address.", max_length=45, null=True
),
),
]

View file

@ -0,0 +1,34 @@
# Generated by Django 3.2.13 on 2023-01-13 14:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("database", "0096_add_user_ip_address_to_jobs"),
]
operations = [
migrations.AlterField(
model_name="duplicatefieldjob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
migrations.AlterField(
model_name="duplicatetablejob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
migrations.AlterField(
model_name="fileimportjob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
]

175
backend/src/baserow/contrib/database/rows/actions.py Normal file → Executable file
View file

@ -4,8 +4,12 @@ from decimal import Decimal
from typing import Any, Dict, List, Optional, Tuple, Type
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.contrib.database.action.scopes import TableActionScopeType
from baserow.contrib.database.action.scopes import (
TABLE_ACTION_CONTEXT,
TableActionScopeType,
)
from baserow.contrib.database.rows.handler import (
GeneratedTableModelForUpdate,
RowHandler,
@ -14,17 +18,27 @@ from baserow.contrib.database.table.handler import TableHandler
from baserow.contrib.database.table.models import GeneratedTableModel, Table
from baserow.contrib.database.table.signals import table_updated
from baserow.core.action.models import Action
from baserow.core.action.registries import ActionScopeStr, ActionType
from baserow.core.action.registries import (
ActionScopeStr,
ActionTypeDescription,
UndoableActionType,
)
from baserow.core.trash.handler import TrashHandler
from baserow.core.utils import Progress
class CreateRowActionType(ActionType):
class CreateRowActionType(UndoableActionType):
type = "create_row"
description = ActionTypeDescription(
_("Create row"), _("Row (%(row_id)s) created"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_id: int
@classmethod
@ -66,8 +80,11 @@ class CreateRowActionType(ActionType):
user_field_names=user_field_names,
)
params = cls.Params(table.id, row.id)
cls.register_action(user, params, cls.scope(table.id))
group = table.database.group
params = cls.Params(
table.id, table.name, table.database.id, table.database.name, row.id
)
cls.register_action(user, params, scope=cls.scope(table.id), group=group)
return row
@ -88,12 +105,18 @@ class CreateRowActionType(ActionType):
)
class CreateRowsActionType(ActionType):
class CreateRowsActionType(UndoableActionType):
type = "create_rows"
description = ActionTypeDescription(
_("Create rows"), _("Rows (%(row_ids)s) created"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_ids: List[int]
trashed_rows_entry_id: Optional[int] = None
@ -127,8 +150,15 @@ class CreateRowsActionType(ActionType):
user, table, rows_values, before_row=before_row, model=model
)
params = cls.Params(table.id, [row.id for row in rows])
cls.register_action(user, params, cls.scope(table.id))
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
[row.id for row in rows],
)
cls.register_action(user, params, scope=cls.scope(table.id), group=group)
return rows
@ -154,12 +184,18 @@ class CreateRowsActionType(ActionType):
)
class ImportRowsActionType(ActionType):
class ImportRowsActionType(UndoableActionType):
type = "import_rows"
description = ActionTypeDescription(
_("Import rows"), _("Rows (%(row_ids)s) imported"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_ids: List[int]
trashed_rows_entry_id: Optional[int] = None
@ -196,8 +232,15 @@ class ImportRowsActionType(ActionType):
# big amount of data.
table_updated.send(cls, table=table, user=user, force_table_refresh=True)
params = cls.Params(table.id, [row.id for row in created_rows])
cls.register_action(user, params, cls.scope(table.id))
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
[row.id for row in created_rows],
)
cls.register_action(user, params, scope=cls.scope(table.id), group=group)
return created_rows, error_report
@ -223,12 +266,18 @@ class ImportRowsActionType(ActionType):
)
class DeleteRowActionType(ActionType):
class DeleteRowActionType(UndoableActionType):
type = "delete_row"
description = ActionTypeDescription(
_("Delete row"), _("Row (%(row_id)s) deleted"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_id: int
@classmethod
@ -255,8 +304,11 @@ class DeleteRowActionType(ActionType):
RowHandler().delete_row_by_id(user, table, row_id, model=model)
params = cls.Params(table.id, row_id)
cls.register_action(user, params, cls.scope(table.id))
database = table.database
params = cls.Params(table.id, table.name, database.id, database.name, row_id)
cls.register_action(
user, params, scope=cls.scope(table.id), group=database.group
)
@classmethod
def scope(cls, table_id) -> ActionScopeStr:
@ -275,12 +327,18 @@ class DeleteRowActionType(ActionType):
)
class DeleteRowsActionType(ActionType):
class DeleteRowsActionType(UndoableActionType):
type = "delete_rows"
description = ActionTypeDescription(
_("Delete rows"), _("Rows (%(row_ids)s) deleted"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_ids: List[int]
trashed_rows_entry_id: int
@ -308,8 +366,16 @@ class DeleteRowsActionType(ActionType):
trashed_rows_entry = RowHandler().delete_rows(user, table, row_ids, model=model)
params = cls.Params(table.id, row_ids, trashed_rows_entry.id)
cls.register_action(user, params, cls.scope(table.id))
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
row_ids,
trashed_rows_entry.id,
)
cls.register_action(user, params, scope=cls.scope(table.id), group=group)
@classmethod
def scope(cls, table_id) -> ActionScopeStr:
@ -401,12 +467,18 @@ def get_before_row_from_displacement(
return queryset.last()
class MoveRowActionType(ActionType):
class MoveRowActionType(UndoableActionType):
type = "move_row"
description = ActionTypeDescription(
_("Move row"), _("Row (%(row_id)s) moved"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_id: int
rows_displacement: int
@ -458,9 +530,16 @@ class MoveRowActionType(ActionType):
if rows_displacement == 0:
return updated_row
params = cls.Params(table.id, row.id, rows_displacement)
cls.register_action(user, params, cls.scope(table.id))
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
row.id,
rows_displacement,
)
cls.register_action(user, params, cls.scope(table.id), group=group)
return updated_row
@classmethod
@ -496,15 +575,21 @@ class MoveRowActionType(ActionType):
row_handler.move_row(user, table, row, before_row=before_row, model=model)
class UpdateRowActionType(ActionType):
class UpdateRowActionType(UndoableActionType):
type = "update_row"
description = ActionTypeDescription(
_("Update row"), _("Row (%(row_id)s) updated"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
row_id: int
row_values: Dict[str, Any]
original_row_values: Dict[str, Any]
new_row_values: Dict[str, Any]
@classmethod
def do(
@ -555,16 +640,19 @@ class UpdateRowActionType(ActionType):
)
updated_row = row_handler.update_row(user, table, row, values, model=model)
row_values = row_handler.get_internal_values_for_fields(row, field_keys)
new_row_values = row_handler.get_internal_values_for_fields(row, field_keys)
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
row.id,
row_values,
original_row_values,
new_row_values,
)
cls.register_action(user, params, cls.scope(table.id))
cls.register_action(user, params, scope=cls.scope(table.id), group=group)
return updated_row
@ -583,25 +671,32 @@ class UpdateRowActionType(ActionType):
def redo(cls, user: AbstractUser, params: Params, action_being_redone: Action):
table = TableHandler().get_table(params.table_id)
RowHandler().update_row_by_id(
user, table, row_id=params.row_id, values=params.new_row_values
user, table, row_id=params.row_id, values=params.row_values
)
class UpdateRowsActionType(ActionType):
class UpdateRowsActionType(UndoableActionType):
type = "update_rows"
description = ActionTypeDescription(
_("Update rows"), _("Rows (%(row_ids)s) updated"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
original_rows_values: List
new_rows: List
table_name: str
database_id: int
database_name: str
row_ids: List[int]
row_values: List[Dict[str, Any]]
original_rows_values: List[Dict[str, Any]]
@classmethod
def do(
cls,
user: AbstractUser,
table: Table,
rows: List,
rows: List[Dict[str, Any]],
model: Optional[Type[GeneratedTableModel]] = None,
) -> List[GeneratedTableModelForUpdate]:
"""
@ -643,9 +738,17 @@ class UpdateRowsActionType(ActionType):
user, table, rows, model=model, rows_to_update=original_rows
)
params = cls.Params(table.id, original_rows_values, new_rows)
cls.register_action(user, params, cls.scope(table.id))
group = table.database.group
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
[row.id for row in updated_rows],
new_rows,
original_rows_values,
)
cls.register_action(user, params, cls.scope(table.id), group=group)
return updated_rows
@ -661,4 +764,4 @@ class UpdateRowsActionType(ActionType):
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_being_redone: Action):
table = TableHandler().get_table(params.table_id)
RowHandler().update_rows(user, table, params.new_rows)
RowHandler().update_rows(user, table, params.row_values)

View file

@ -115,19 +115,24 @@ class RowHandler:
if field_id in values or field["name"] in values
}
def prepare_rows_in_bulk(self, fields, rows, generate_error_report=False):
def prepare_rows_in_bulk(
self,
fields: Dict[int, Dict[str, Any]],
rows: List[Dict[str, Any]],
generate_error_report: bool = False,
) -> Tuple[List[Dict[str, Any]], Dict[int, Dict[str, Any]]]:
"""
Prepares a set of values in bulk for all rows so that they can be created or
updated in the database. It will check if the values can actually be set and
prepares them based on their field type.
:param fields: The returned fields object from the get_model method.
:type fields: dict
:param values: The rows and their values that need to be prepared.
:type values: dict
:param rows: The rows and their values that need to be prepared.
:param generate_error_report: If set to True, the method will return an
object that contains information about the errors that
occurred during the rows preparation.
:return: The prepared values for all rows in the same structure as it was
passed in.
:rtype: dict
"""
field_ids = {}
@ -1268,7 +1273,7 @@ class RowHandler:
self,
user: AbstractUser,
table: Table,
rows: List,
rows: List[Dict[str, Any]],
model: Optional[Type[GeneratedTableModel]] = None,
rows_to_update: Optional[RowsForUpdate] = None,
) -> List[GeneratedTableModelForUpdate]:

108
backend/src/baserow/contrib/database/table/actions.py Normal file → Executable file
View file

@ -2,24 +2,38 @@ import dataclasses
from typing import Any, List, Optional
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.contrib.database.action.scopes import DATABASE_ACTION_CONTEXT
from baserow.contrib.database.handler import DatabaseHandler
from baserow.contrib.database.models import Database
from baserow.contrib.database.table.handler import TableHandler
from baserow.contrib.database.table.models import Table
from baserow.core.action.models import Action
from baserow.core.action.registries import ActionScopeStr, ActionType
from baserow.core.action.registries import (
ActionScopeStr,
ActionTypeDescription,
UndoableActionType,
)
from baserow.core.action.scopes import ApplicationActionScopeType
from baserow.core.trash.handler import TrashHandler
from baserow.core.utils import ChildProgressBuilder, Progress
class CreateTableActionType(ActionType):
class CreateTableActionType(UndoableActionType):
type = "create_table"
description = ActionTypeDescription(
_("Create table"),
_('Table "%(table_name)s" (%(table_id)s) created'),
DATABASE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
database_id: int
database_name: str
table_id: int
table_name: str
@classmethod
def do(
@ -58,8 +72,9 @@ class CreateTableActionType(ActionType):
progress=progress,
)
params = cls.Params(table.id)
cls.register_action(user, params, cls.scope(database.id))
group = database.group
params = cls.Params(database.id, database.name, table.id, table.name)
cls.register_action(user, params, cls.scope(database.id), group=group)
return table, error_report
@ -79,12 +94,20 @@ class CreateTableActionType(ActionType):
)
class DeleteTableActionType(ActionType):
class DeleteTableActionType(UndoableActionType):
type = "delete_table"
description = ActionTypeDescription(
_("Delete table"),
_('Table "%(table_name)s" (%(table_id)s) deleted'),
DATABASE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
database_id: int
database_name: str
table_id: int
table_name: str
@classmethod
def do(cls, user: AbstractUser, table: Table):
@ -99,12 +122,12 @@ class DeleteTableActionType(ActionType):
:raises ValueError: When the provided table is not an instance of Table.
"""
params = cls.Params(table.id)
database_id = table.database_id
database = table.database
params = cls.Params(database.id, database.name, table.id, table.name)
TableHandler().delete_table(user, table)
cls.register_action(user, params, cls.scope(database_id))
cls.register_action(user, params, cls.scope(database.id), group=database.group)
@classmethod
def scope(cls, database_id) -> ActionScopeStr:
@ -121,14 +144,20 @@ class DeleteTableActionType(ActionType):
TableHandler().delete_table_by_id(user, params.table_id)
class OrderTableActionType(ActionType):
type = "order_table"
class OrderTableActionType(UndoableActionType):
type = "order_tables"
description = ActionTypeDescription(
_("Order tables"),
_("Tables order changed"),
DATABASE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
database_id: int
database_name: str
tables_order: List[int]
original_tables_order: List[int]
new_tables_order: List[int]
@classmethod
def do(cls, user: AbstractUser, database: Database, order: List[int]):
@ -147,11 +176,11 @@ class OrderTableActionType(ActionType):
table_handler = TableHandler()
original_table_order = table_handler.get_tables_order(database)
params = cls.Params(database.id, original_table_order, new_tables_order=order)
params = cls.Params(database.id, database.name, order, original_table_order)
table_handler.order_tables(user, database, order=order)
cls.register_action(user, params, cls.scope(database.id))
cls.register_action(user, params, cls.scope(database.id), group=database.group)
@classmethod
def scope(cls, database_id) -> ActionScopeStr:
@ -171,18 +200,28 @@ class OrderTableActionType(ActionType):
TableHandler().order_tables(
user,
DatabaseHandler().get_database(params.database_id),
order=params.new_tables_order,
order=params.tables_order,
)
class UpdateTableActionType(ActionType):
class UpdateTableActionType(UndoableActionType):
type = "update_table"
description = ActionTypeDescription(
_("Update table"),
_(
"Table (%(table_id)s) name changed from "
'"%(original_table_name)s" to "%(table_name)s"'
),
DATABASE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
database_id: int
database_name: str
table_id: int
table_name: str
original_table_name: str
new_table_name: str
@classmethod
def do(cls, user: AbstractUser, table: Table, name: str) -> Table:
@ -204,13 +243,16 @@ class UpdateTableActionType(ActionType):
TableHandler().update_table(user, table, name=name)
database = table.database
params = cls.Params(
database.id,
database.name,
table.id,
name,
original_table_name,
new_table_name=name,
)
cls.register_action(user, params, cls.scope(table.database_id))
cls.register_action(user, params, cls.scope(database.id), group=database.group)
return table
@classmethod
@ -225,17 +267,28 @@ class UpdateTableActionType(ActionType):
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_being_redone: Action):
TableHandler().update_table_by_id(
user, params.table_id, name=params.new_table_name
)
TableHandler().update_table_by_id(user, params.table_id, name=params.table_name)
class DuplicateTableActionType(ActionType):
class DuplicateTableActionType(UndoableActionType):
type = "duplicate_table"
description = ActionTypeDescription(
_("Duplicate table"),
_(
'Table "%(table_name)s" (%(table_id)s) duplicated from '
'"%(original_table_name)s" (%(original_table_id)s) '
),
DATABASE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
database_id: int
database_name: str
table_id: int
table_name: str
original_table_id: int
original_table_name: str
@classmethod
def do(
@ -258,9 +311,16 @@ class DuplicateTableActionType(ActionType):
new_table_clone = TableHandler().duplicate_table(
user, table, progress_builder=progress_builder
)
cls.register_action(
user, cls.Params(new_table_clone.id), cls.scope(table.database_id)
database = table.database
params = cls.Params(
database.id,
database.name,
new_table_clone.id,
new_table_clone.name,
table.id,
table.name,
)
cls.register_action(user, params, cls.scope(database.id), group=database.group)
return new_table_clone
@classmethod

View file

@ -26,7 +26,11 @@ from baserow.contrib.database.table.cache import (
from baserow.contrib.database.views.exceptions import ViewFilterTypeNotAllowedForField
from baserow.contrib.database.views.registries import view_filter_type_registry
from baserow.core.db import specific_iterator
from baserow.core.jobs.mixins import JobWithUndoRedoIds, JobWithWebsocketId
from baserow.core.jobs.mixins import (
JobWithUndoRedoIds,
JobWithUserIpAddress,
JobWithWebsocketId,
)
from baserow.core.jobs.models import Job
from baserow.core.mixins import (
CreatedAndUpdatedOnMixin,
@ -723,7 +727,9 @@ class Table(
return f"tbl_order_id_{self.id}_idx"
class DuplicateTableJob(JobWithWebsocketId, JobWithUndoRedoIds, Job):
class DuplicateTableJob(
JobWithUserIpAddress, JobWithWebsocketId, JobWithUndoRedoIds, Job
):
original_table = models.ForeignKey(
Table,

View file

@ -1,27 +0,0 @@
from typing import Optional, cast
from rest_framework import serializers
from baserow.core.action.registries import ActionScopeStr, ActionScopeType
class TableActionScopeType(ActionScopeType):
type = "table"
@classmethod
def value(cls, table_id: int) -> ActionScopeStr:
return cast(ActionScopeStr, cls.type + str(table_id))
def get_request_serializer_field(self) -> serializers.Field:
return serializers.IntegerField(
min_value=0,
allow_null=True,
required=False,
help_text="If set to a tables id then any actions directly related to that "
"table will be be included when undoing or redoing.",
)
def valid_serializer_value_to_scope_str(
self, value: int
) -> Optional[ActionScopeStr]:
return self.value(value)

517
backend/src/baserow/contrib/database/views/actions.py Normal file → Executable file
View file

@ -4,8 +4,11 @@ from copy import deepcopy
from typing import Any, Dict, List, Optional
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.contrib.database.action.scopes import (
TABLE_ACTION_CONTEXT,
VIEW_ACTION_CONTEXT,
TableActionScopeType,
ViewActionScopeType,
)
@ -22,18 +25,33 @@ from baserow.contrib.database.views.models import (
)
from baserow.contrib.database.views.registries import view_type_registry
from baserow.core.action.models import Action
from baserow.core.action.registries import ActionScopeStr, ActionType
from baserow.core.action.registries import (
ActionScopeStr,
ActionTypeDescription,
UndoableActionType,
)
from baserow.core.trash.handler import TrashHandler
class CreateViewFilterActionType(ActionType):
class CreateViewFilterActionType(UndoableActionType):
type = "create_view_filter"
description = ActionTypeDescription(
_("Create a view filter"),
_('View filter created on field "%(field_name)s" (%(field_id)s)'),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_filter_id: int
view_id: int
view_name: str
field_id: int
field_name: str
table_id: int
table_name: str
database_id: int
database_name: str
view_filter_id: int
filter_type: str
filter_value: str
@ -65,13 +83,21 @@ class CreateViewFilterActionType(ActionType):
user, view, field, filter_type, filter_value
)
cls.register_action(
user=user,
params=cls.Params(
view_filter.id, view.id, field.id, filter_type, filter_value
),
scope=cls.scope(view.id),
group = view.table.database.group
params = cls.Params(
view.id,
view.name,
field.id,
field.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
view_filter.id,
filter_type,
filter_value,
)
cls.register_action(user, params, cls.scope(view.id), group)
return view_filter
@classmethod
@ -100,18 +126,32 @@ class CreateViewFilterActionType(ActionType):
)
class UpdateViewFilterActionType(ActionType):
# TODO: What to do here with fast UI updates?
class UpdateViewFilterActionType(UndoableActionType):
type = "update_view_filter"
description = ActionTypeDescription(
_("Update a view filter"),
_('View filter updated on field "%(field_name)s" (%(field_id)s)'),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
field_id: int
field_name: str
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
view_filter_id: int
filter_type: str
filter_value: str
original_field_id: int
original_field_name: str
original_filter_type: str
original_filter_value: str
new_field_id: int
new_filter_type: str
new_filter_value: str
@classmethod
def do(
@ -138,6 +178,7 @@ class UpdateViewFilterActionType(ActionType):
"""
original_view_filter_field_id = view_filter.field_id
original_view_filter_field_name = view_filter.field.name
original_view_filter_type = view_filter.type
original_view_filter_value = view_filter.value
@ -145,18 +186,30 @@ class UpdateViewFilterActionType(ActionType):
updated_view_filter = view_handler.update_filter(
user, view_filter, field, filter_type, filter_value
)
view = view_filter.view
params = cls.Params(
updated_view_filter.field.id,
updated_view_filter.field.name,
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
view_filter.id,
updated_view_filter.type,
updated_view_filter.value,
original_view_filter_field_id,
original_view_filter_field_name,
original_view_filter_type,
original_view_filter_value,
)
group = updated_view_filter.field.table.database.group
cls.register_action(
user=user,
params=cls.Params(
view_filter.id,
original_view_filter_field_id,
original_view_filter_type,
original_view_filter_value,
updated_view_filter.field_id,
updated_view_filter.type,
updated_view_filter.value,
),
scope=cls.scope(view_filter.view_id),
user,
params,
cls.scope(view_filter.view_id),
group,
)
return updated_view_filter
@ -182,7 +235,7 @@ class UpdateViewFilterActionType(ActionType):
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_to_redo: Action):
field = FieldHandler().get_field(params.new_field_id)
field = FieldHandler().get_field(params.field_id)
view_handler = ViewHandler()
view_filter = view_handler.get_filter(user, params.view_filter_id)
@ -191,19 +244,30 @@ class UpdateViewFilterActionType(ActionType):
user,
view_filter,
field,
params.new_filter_type,
params.new_filter_value,
params.filter_type,
params.filter_value,
)
class DeleteViewFilterActionType(ActionType):
class DeleteViewFilterActionType(UndoableActionType):
type = "delete_view_filter"
description = ActionTypeDescription(
_("Delete a view filter"),
_('View filter deleted from field "%(field_name)s" (%(field_id)s)'),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_filter_id: int
view_id: int
field_id: int
field_name: str
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
view_filter_id: int
filter_type: str
filter_value: str
@ -225,22 +289,35 @@ class DeleteViewFilterActionType(ActionType):
view_filter_id = view_filter.id
view_id = view_filter.view_id
view_name = view_filter.view.name
field_id = view_filter.field_id
filter_type = view_filter.type
filter_value = view_filter.value
field_name = view_filter.field.name
view_filter_type = view_filter.type
view_filter_value = view_filter.value
ViewHandler().delete_filter(user, view_filter)
params = cls.Params(
field_id,
field_name,
view_id,
view_name,
view_filter.view.table.id,
view_filter.view.table.name,
view_filter.view.table.database.id,
view_filter.view.table.database.name,
view_filter_id,
view_filter_type,
view_filter_value,
)
group = view_filter.view.table.database.group
cls.register_action(
user=user,
params=cls.Params(
view_filter_id,
view_id,
field_id,
filter_type,
filter_value,
user,
params,
cls.scope(
view_filter.view_id,
),
scope=cls.scope(view_filter.view.id),
group,
)
@classmethod
@ -269,14 +346,25 @@ class DeleteViewFilterActionType(ActionType):
ViewHandler().delete_filter(user, view_filter)
class CreateViewSortActionType(ActionType):
class CreateViewSortActionType(UndoableActionType):
type = "create_view_sort"
description = ActionTypeDescription(
_("Create a view sort"),
_('View sorted on field "%(field_name)s" (%(field_id)s)'),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_sort_id: int
view_id: int
field_id: int
field_name: str
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
view_sort_id: int
sort_order: str
@classmethod
@ -298,11 +386,20 @@ class CreateViewSortActionType(ActionType):
view_sort = ViewHandler().create_sort(user, view, field, sort_order)
cls.register_action(
user=user,
params=cls.Params(view_sort.id, view.id, field.id, sort_order),
scope=cls.scope(view.id),
params = cls.Params(
field.id,
field.name,
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
view_sort.id,
sort_order,
)
group = view.table.database.group
cls.register_action(user, params, cls.scope(view.id), group)
return view_sort
@classmethod
@ -326,16 +423,29 @@ class CreateViewSortActionType(ActionType):
)
class UpdateViewSortActionType(ActionType):
class UpdateViewSortActionType(UndoableActionType):
type = "update_view_sort"
description = ActionTypeDescription(
_("Update a view sort"),
_('View sort updated on field "%(field_name)s" (%(field_id)s)'),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
field_id: int
field_name: str
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
view_sort_id: int
sort_order: str
original_field_id: int
original_field_name: str
original_sort_order: str
new_field_id: int
new_sort_order: str
@classmethod
def do(
@ -357,8 +467,11 @@ class UpdateViewSortActionType(ActionType):
:param order: Indicates the sort order direction.
"""
original_view_sort_field_id = view_sort.field.id
original_view_sort_sort_order = view_sort.order
original_field_id = view_sort.field.id
original_field_name = view_sort.field.name
view_id = view_sort.view.id
view_name = view_sort.view.name
original_sort_order = view_sort.order
handler = ViewHandler()
updated_view_sort = handler.update_sort(user, view_sort, field, order)
@ -366,13 +479,22 @@ class UpdateViewSortActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(
view_sort.id,
original_view_sort_field_id,
original_view_sort_sort_order,
updated_view_sort.field.id,
updated_view_sort.field.name,
view_id,
view_name,
updated_view_sort.view.table.id,
updated_view_sort.view.table.name,
updated_view_sort.view.table.database.id,
updated_view_sort.view.table.database.name,
updated_view_sort.id,
updated_view_sort.order,
original_field_id,
original_field_name,
original_sort_order,
),
scope=cls.scope(view_sort.view.id),
group=view_sort.view.table.database.group,
)
return updated_view_sort
@ -392,22 +514,33 @@ class UpdateViewSortActionType(ActionType):
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_to_redo: Action):
field = FieldHandler().get_field(params.new_field_id)
field = FieldHandler().get_field(params.field_id)
view_handler = ViewHandler()
view_sort = view_handler.get_sort(user, params.view_sort_id)
view_handler.update_sort(user, view_sort, field, params.new_sort_order)
view_handler.update_sort(user, view_sort, field, params.sort_order)
class DeleteViewSortActionType(ActionType):
class DeleteViewSortActionType(UndoableActionType):
type = "delete_view_sort"
description = ActionTypeDescription(
_("Delete a view sort"),
_('View sort deleted from field "%(field_name)s" (%(field_id)s)'),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_sort_id: int
view_id: int
field_id: int
field_name: str
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
view_sort_id: int
sort_order: str
@classmethod
@ -425,21 +558,27 @@ class DeleteViewSortActionType(ActionType):
view_sort_id = view_sort.id
view_id = view_sort.view.id
view_name = view_sort.view.name
field_id = view_sort.field.id
field_name = view_sort.field.name
sort_order = view_sort.order
ViewHandler().delete_sort(user, view_sort)
cls.register_action(
user=user,
params=cls.Params(
view_sort_id,
view_id,
field_id,
sort_order,
),
scope=cls.scope(view_sort.view.id),
params = cls.Params(
field_id,
field_name,
view_id,
view_name,
view_sort.view.table.id,
view_sort.view.table.name,
view_sort.view.table.database.id,
view_sort.view.table.database.name,
view_sort_id,
sort_order,
)
group = view_sort.view.table.database.group
cls.register_action(user, params, cls.scope(view_sort.view.id), group)
@classmethod
def scope(cls, view_id: int) -> ActionScopeStr:
@ -461,14 +600,20 @@ class DeleteViewSortActionType(ActionType):
ViewHandler().delete_sort(user, view_sort)
class OrderViewsActionType(ActionType):
class OrderViewsActionType(UndoableActionType):
type = "order_views"
description = ActionTypeDescription(
_("Order views"), _("Views order changed"), TABLE_ACTION_CONTEXT
)
@dataclasses.dataclass
class Params:
table_id: int
table_name: str
database_id: int
database_name: str
order: List[int]
original_order: List[int]
new_order: List[int]
@classmethod
def do(
@ -493,8 +638,15 @@ class OrderViewsActionType(ActionType):
ViewHandler().order_views(user, table, order)
params = cls.Params(table.id, original_order, order)
cls.register_action(user, params, cls.scope(table.id))
params = cls.Params(
table.id,
table.name,
table.database.id,
table.database.name,
order,
original_order,
)
cls.register_action(user, params, cls.scope(table.id), table.database.group)
@classmethod
def scope(cls, table_id: int) -> ActionScopeStr:
@ -508,17 +660,27 @@ class OrderViewsActionType(ActionType):
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_to_redo: Action):
table = TableHandler().get_table(params.table_id)
ViewHandler().order_views(user, table, params.new_order)
ViewHandler().order_views(user, table, params.order)
class UpdateViewFieldOptionsActionType(ActionType):
class UpdateViewFieldOptionsActionType(UndoableActionType):
type = "update_view_field_options"
description = ActionTypeDescription(
_("Update view field options"),
_("ViewFieldOptions updated"),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
field_options: FieldOptionsDict
original_field_options: FieldOptionsDict
new_field_options: FieldOptionsDict
@classmethod
def do(
@ -564,10 +726,16 @@ class UpdateViewFieldOptionsActionType(ActionType):
user=user,
params=cls.Params(
view.id,
dict(original_field_options_to_save),
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
dict(new_field_options_to_save),
dict(original_field_options_to_save),
),
scope=cls.scope(view.id),
group=view.table.database.group,
)
@classmethod
@ -587,18 +755,28 @@ class UpdateViewFieldOptionsActionType(ActionType):
view_handler = ViewHandler()
view = view_handler.get_view(params.view_id).specific
view_handler.update_field_options(
user=user, view=view, field_options=params.new_field_options
user=user, view=view, field_options=params.field_options
)
class RotateViewSlugActionType(ActionType):
class RotateViewSlugActionType(UndoableActionType):
type = "rotate_view_slug"
description = ActionTypeDescription(
_("View slug URL updated"),
_("View changed public slug URL"),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
slug: str
original_slug: str
new_slug: str
@classmethod
def do(cls, user: AbstractUser, view: View) -> View:
@ -618,8 +796,18 @@ class RotateViewSlugActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(view.id, original_slug, view.slug),
params=cls.Params(
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
view.slug,
original_slug,
),
scope=cls.scope(view.id),
group=view.table.database.group,
)
return view
@ -637,17 +825,27 @@ class RotateViewSlugActionType(ActionType):
def redo(cls, user: AbstractUser, params: Params, action_to_redo: Action):
view_handler = ViewHandler()
view = view_handler.get_view_for_update(params.view_id)
view_handler.update_view_slug(user, view, params.new_slug)
view_handler.update_view_slug(user, view, params.slug)
class UpdateViewActionType(ActionType):
class UpdateViewActionType(UndoableActionType):
type = "update_view"
description = ActionTypeDescription(
_("Update view"),
_('View "%(view_name)s" (%(view_id)s) updated'),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
data: Dict[str, Any]
original_data: Dict[str, Any]
new_data: Dict[str, Any]
@classmethod
def do(
@ -683,8 +881,18 @@ class UpdateViewActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(view.id, original_data, new_data),
params=cls.Params(
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
new_data,
original_data,
),
scope=cls.scope(view.id),
group=view.table.database.group,
)
return view
@ -702,15 +910,26 @@ class UpdateViewActionType(ActionType):
def redo(cls, user: AbstractUser, params: Params, action_to_redo: Action):
view_handler = ViewHandler()
view = view_handler.get_view_for_update(params.view_id).specific
view_handler.update_view(user, view, **params.new_data)
view_handler.update_view(user, view, **params.data)
class CreateViewActionType(ActionType):
class CreateViewActionType(UndoableActionType):
type = "create_view"
description = ActionTypeDescription(
_("Create view"),
_('View "%(view_name)s" (%(view_id)s) created'),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
view_type: str
table_id: int
table_name: str
database_id: int
database_name: str
@classmethod
def do(cls, user: AbstractUser, table: Table, type_name: str, **kwargs) -> View:
@ -735,8 +954,17 @@ class CreateViewActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(view.id),
params=cls.Params(
view.id,
view.name,
type_name,
table.id,
table.name,
table.database.id,
table.database.name,
),
scope=cls.scope(table.id),
group=table.database.group,
)
return view
@ -754,12 +982,27 @@ class CreateViewActionType(ActionType):
TrashHandler.restore_item(user, "view", params.view_id)
class DuplicateViewActionType(ActionType):
class DuplicateViewActionType(UndoableActionType):
type = "duplicate_view"
description = ActionTypeDescription(
_("Duplicate view"),
_(
'View "%(view_name)s" (%(view_id)s) duplicated from '
'view "%(original_view_name)s" (%(original_view_id)s)'
),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
original_view_id: int
original_view_name: str
@classmethod
def do(cls, user: AbstractUser, original_view: View) -> View:
@ -780,8 +1023,18 @@ class DuplicateViewActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(view.id),
params=cls.Params(
view.id,
view.name,
original_view.table.id,
original_view.table.name,
original_view.table.database.id,
original_view.table.database.name,
original_view.id,
original_view.name,
),
scope=cls.scope(original_view.table.id),
group=original_view.table.database.group,
)
return view
@ -799,12 +1052,22 @@ class DuplicateViewActionType(ActionType):
TrashHandler.restore_item(user, "view", params.view_id)
class DeleteViewActionType(ActionType):
class DeleteViewActionType(UndoableActionType):
type = "delete_view"
description = ActionTypeDescription(
_("Delete view"),
_('View "%(view_name)s" (%(view_id)s) deleted'),
TABLE_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
@classmethod
def do(cls, user: AbstractUser, view: View):
@ -822,8 +1085,16 @@ class DeleteViewActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(view.id),
params=cls.Params(
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
),
scope=cls.scope(view.table_id),
group=view.table.database.group,
)
@classmethod
@ -839,12 +1110,22 @@ class DeleteViewActionType(ActionType):
ViewHandler().delete_view_by_id(user, params.view_id)
class CreateDecorationActionType(ActionType):
class CreateDecorationActionType(UndoableActionType):
type = "create_decoration"
description = ActionTypeDescription(
_("Create decoration"),
_("View decoration %(decorator_id)s created"),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
decorator_id: int
decorator_type_name: str
value_provider_type_name: str
@ -887,12 +1168,18 @@ class CreateDecorationActionType(ActionType):
user=user,
params=cls.Params(
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
decoration.id,
decorator_type_name,
value_provider_type_name,
value_provider_conf,
),
scope=cls.scope(view.id),
group=view.table.database.group,
)
return decoration
@ -919,11 +1206,22 @@ class CreateDecorationActionType(ActionType):
)
class UpdateDecorationActionType(ActionType):
class UpdateDecorationActionType(UndoableActionType):
type = "update_decoration"
description = ActionTypeDescription(
_("Update decoration"),
_("View decoration %(decorator_id)s updated"),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
decorator_id: int
original_decoration_type_name: str
original_value_provider_type_name: str
@ -968,6 +1266,7 @@ class UpdateDecorationActionType(ActionType):
original_value_provider_type_name = original_view_decoration.value_provider_type
original_value_provider_conf = original_view_decoration.value_provider_conf
original_order = original_view_decoration.order
view = view_decoration.view
view_decoration_updated = ViewHandler().update_decoration(
view_decoration,
@ -981,6 +1280,12 @@ class UpdateDecorationActionType(ActionType):
cls.register_action(
user=user,
params=cls.Params(
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
view_decoration.id,
original_decoration_type_name,
original_value_provider_type_name,
@ -992,6 +1297,7 @@ class UpdateDecorationActionType(ActionType):
order,
),
scope=cls.scope(view_decoration.view_id),
group=view.table.database.group,
)
return view_decoration_updated
@ -1025,12 +1331,23 @@ class UpdateDecorationActionType(ActionType):
)
class DeleteDecorationActionType(ActionType):
class DeleteDecorationActionType(UndoableActionType):
type = "delete_decoration"
description = ActionTypeDescription(
_("Delete decoration"),
_("View decoration %(decorator_id)s deleted"),
VIEW_ACTION_CONTEXT,
)
@dataclasses.dataclass
class Params:
view_id: int
view_name: str
table_id: int
table_name: str
database_id: int
database_name: str
decorator_id: int
original_decorator_id: int
original_decorator_type_name: str
original_value_provider_type_name: str
@ -1054,10 +1371,17 @@ class DeleteDecorationActionType(ActionType):
ViewHandler().delete_decoration(view_decoration, user=user)
view = view_decoration.view
cls.register_action(
user=user,
params=cls.Params(
original_view_decoration.view_id,
view.id,
view.name,
view.table.id,
view.table.name,
view.table.database.id,
view.table.database.name,
view_decoration.id,
original_view_decoration.id,
original_view_decoration.type,
original_view_decoration.value_provider_type,
@ -1065,6 +1389,7 @@ class DeleteDecorationActionType(ActionType):
original_view_decoration.order,
),
scope=cls.scope(view_decoration.view_id),
group=view.table.database.group,
)
@classmethod

41
backend/src/baserow/core/action/handler.py Normal file → Executable file
View file

@ -10,10 +10,16 @@ from django.db import transaction
from django.db.models import Q
from django.utils import timezone
from baserow.core.action.models import Action
from baserow.core.action.registries import ActionScopeStr, action_type_registry
from baserow.core.exceptions import LockConflict
from .models import Action
from .registries import (
ActionScopeStr,
UndoableActionCustomCleanupMixin,
action_type_registry,
)
from .signals import ActionCommandType
logger = logging.getLogger(__name__)
@ -41,6 +47,25 @@ class ActionHandler:
redoing them.
"""
@classmethod
def send_action_done_signal_for_actions(
cls,
user: AbstractUser,
actions: List[Action],
action_command_type: ActionCommandType,
**kwargs,
) -> None:
for action in actions:
action_type = action_type_registry.get(action.type)
action_type.send_action_done_signal(
user,
action.params,
action.scope,
action.group,
action.updated_on,
action_command_type,
)
@classmethod
def _undo_action(
cls, user: AbstractUser, action: Action, undone_at: datetime
@ -114,7 +139,9 @@ class ActionHandler:
)
# refresh actions from db to ensure everything is updated
return list(Action.objects.filter(pk__in=action_being_undone_ids))
actions = list(Action.objects.filter(pk__in=action_being_undone_ids))
cls.send_action_done_signal_for_actions(user, actions, ActionCommandType.UNDO)
return actions
@classmethod
def _redo_action(cls, user: AbstractUser, action: Action) -> None:
@ -220,14 +247,16 @@ class ActionHandler:
)
# refresh actions from db to ensure everything is updated
return list(
actions = list(
Action.objects.filter(pk__in=actions_being_redone_ids).order_by(
"created_on", "id"
)
)
cls.send_action_done_signal_for_actions(user, actions, ActionCommandType.REDO)
return actions
@classmethod
def clean_up_old_actions(cls):
def clean_up_old_undoable_actions(cls):
"""
Any actions which haven't been updated in
settings.MINUTES_UNTIL_ACTION_CLEANED_UP will be deleted any have an extra
@ -240,7 +269,7 @@ class ActionHandler:
types_with_custom_clean_up = set()
for action_type in action_type_registry.get_all():
if action_type.has_custom_cleanup():
if isinstance(action_type, UndoableActionCustomCleanupMixin):
types_with_custom_clean_up.add(action_type.type)
# Delete in a separate atomic block so if we crash later we don't roll back

View file

@ -22,10 +22,11 @@ class JSONEncoderSupportingDataClasses(json.JSONEncoder):
class Action(CreatedAndUpdatedOnMixin, models.Model):
"""
An action represents a user performed change to Baserow.
An undoable-action represents a user performed change that can be undone.
"""
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
group = models.ForeignKey("core.Group", null=True, on_delete=models.SET_NULL)
session = models.TextField(null=True, blank=True, db_index=True)
type = models.TextField(db_index=True)
params = models.JSONField(encoder=JSONEncoderSupportingDataClasses)

153
backend/src/baserow/core/action/registries.py Normal file → Executable file
View file

@ -1,8 +1,11 @@
import abc
import dataclasses
from typing import Any, NewType, Optional
from datetime import datetime
from typing import Any, Dict, NewType, Optional
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
@ -10,9 +13,12 @@ from baserow.api.sessions import (
get_client_undo_redo_action_group_id,
get_untrusted_client_session_id,
)
from baserow.core.action.models import Action
from baserow.core.models import Group
from baserow.core.registry import Instance, Registry
from .models import Action
from .signals import ActionCommandType, action_done
# An alias type of a str (its exactly a str, just with a different name in the type
# system). We use this instead of a normal str for type safety ensuring
# only str's returned by ActionScopeType.value and
@ -87,9 +93,46 @@ class ActionScopeRegistry(Registry[ActionScopeType]):
name = "action_scope"
@dataclasses.dataclass
class ActionTypeDescription:
"""
The human readable and translatable description of the action type. The
short string is used when rendering the action type in a list, the long
string + the context will be used when rendering the action detailed
description.
"""
short: str = ""
long: str = ""
context: str = ""
def render_action_type_description(
description: ActionTypeDescription, params_dict: Dict[str, Any]
) -> str:
"""
Renders the action type description using the params dict. The params dict
contains the parameters that are required to the action. The
description can contain placeholders that will be replaced by the params
dict values. For example, if the description is "Created table %table_name%"
and the params dict is {"table_name": "My table"} then the result will be
"Created table My table".
"""
if not description.long:
return f"{description.short}: {params_dict}"
if description.context:
return f"{description.long % params_dict} {description.context % params_dict}"
return f"{description.long % params_dict}"
class ActionType(Instance, abc.ABC):
type: str = NotImplemented
description: ActionTypeDescription = ActionTypeDescription()
@dataclasses.dataclass
class Params:
"""
@ -125,6 +168,80 @@ class ActionType(Instance, abc.ABC):
pass
@classmethod
def get_long_description(cls, params_dict: Dict[str, Any], *args, **kwargs) -> str:
"""
Should return a human readable description of the action being performed.
"""
return render_action_type_description(cls.description, params_dict)
@classmethod
def get_short_description(cls, *args, **kwargs) -> str:
"""
Should return a human readable description of the action type being performed.
The `str` here forces the lazy translation to be evaluated.
"""
return str(cls.description.short) or _(cls.type.replace("_", " ").capitalize())
@classmethod
def send_action_done_signal(
cls,
user: AbstractUser,
params: Dict[str, Any],
scope: ActionScopeStr,
group: Optional[Group] = None,
timestamp: Optional[datetime] = None,
action_command_type: ActionCommandType = ActionCommandType.DO,
):
"""
Sends the action done signal. This is called by the do method of the action
type. This is a separate method so that it can be called from other places
where the action is performed but not registered.
"""
session = get_untrusted_client_session_id(user)
action_group = get_client_undo_redo_action_group_id(user)
action_timestamp = timestamp if timestamp else timezone.now()
action_done.send(
sender=cls,
user=user,
action_type=cls,
action_params=params,
action_command_type=action_command_type,
action_timestamp=action_timestamp,
group=group,
session=session,
scope=scope,
action_group=action_group,
)
@classmethod
def register_action(
cls,
user: AbstractUser,
params: Any,
scope: ActionScopeStr,
group: Optional[Group] = None,
) -> Optional[Action]:
"""
Registers a new action in the database using the untrusted client session id
if set in the request headers.
:param user: The user who performed the action.
:param params: A dataclass to serialize and store with the action which will be
provided when undoing and redoing it.
:param scope: The scope in which this action occurred.
:param group: The group this action is associated with.
:return: The created action if any.
"""
cls.send_action_done_signal(user, dataclasses.asdict(params), scope, group)
class UndoableActionTypeMixin(abc.ABC):
@classmethod
@abc.abstractmethod
def undo(cls, user: AbstractUser, params: Any, action_being_undone: Action):
@ -161,7 +278,8 @@ class ActionType(Instance, abc.ABC):
user: AbstractUser,
params: Any,
scope: ActionScopeStr,
) -> Action:
group: Optional[Group] = None,
) -> Optional[Action]:
"""
Registers a new action in the database using the untrusted client session id
if set in the request headers.
@ -170,6 +288,8 @@ class ActionType(Instance, abc.ABC):
:param params: A dataclass to serialize and store with the action which will be
provided when undoing and redoing it.
:param scope: The scope in which this action occurred.
:param group: The group this action is associated with.
:return: The created action.
"""
session = get_untrusted_client_session_id(user)
@ -177,31 +297,40 @@ class ActionType(Instance, abc.ABC):
action = Action.objects.create(
user=user,
group=group,
type=cls.type,
params=params,
scope=scope,
session=session,
action_group=action_group,
)
cls.send_action_done_signal(
user, dataclasses.asdict(params), scope, group, action.created_on
)
return action
class UndoableActionCustomCleanupMixin(abc.ABC):
@classmethod
@abc.abstractmethod
def clean_up_any_extra_action_data(cls, action_being_cleaned_up: Action):
"""
Should cleanup any extra data associated with the action as it has expired.
This method is called when an action is undone or redone. This is useful for
cleaning up any data that is no longer required after the action has been
undone or redone. This method is called after the undo or redo method has
been called.
:param action_being_cleaned_up: The action that is old and being cleaned up.
:param user: The user performing the undo or redo.
:param action: The action that is being undone or redone.
"""
pass
@classmethod
def has_custom_cleanup(cls) -> bool:
# noinspection PyUnresolvedReferences
return (
cls.clean_up_any_extra_action_data.__func__
!= ActionType.clean_up_any_extra_action_data.__func__
)
class UndoableActionType(UndoableActionTypeMixin, ActionType):
pass
class ActionTypeRegistry(Registry[ActionType]):

4
backend/src/baserow/core/action/scopes.py Normal file → Executable file
View file

@ -1,9 +1,13 @@
from typing import Optional, cast
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from baserow.core.action.registries import ActionScopeStr, ActionScopeType
GROUP_CONTEXT = _('in group "%(group_name)s" (%(group_id)s).')
class RootActionScopeType(ActionScopeType):
type = "root"

View file

@ -0,0 +1,12 @@
from enum import Enum
from django.dispatch import Signal
class ActionCommandType(Enum):
DO = "DO"
UNDO = "UNDO"
REDO = "REDO"
action_done = Signal()

View file

@ -10,7 +10,7 @@ from baserow.core.action.handler import ActionHandler
@app.task(bind=True, queue="export")
def cleanup_old_actions(self):
ActionHandler().clean_up_old_actions()
ActionHandler().clean_up_old_undoable_actions()
# noinspection PyUnusedLocal

275
backend/src/baserow/core/actions.py Normal file → Executable file
View file

@ -2,24 +2,41 @@ import dataclasses
from typing import Any, List, Optional
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.core.action.models import Action
from baserow.core.action.registries import ActionScopeStr, ActionType
from baserow.core.action.scopes import GroupActionScopeType, RootActionScopeType
from baserow.core.action.registries import (
ActionScopeStr,
ActionTypeDescription,
UndoableActionType,
)
from baserow.core.action.scopes import (
GROUP_CONTEXT,
GroupActionScopeType,
RootActionScopeType,
)
from baserow.core.handler import CoreHandler, GroupForUpdate
from baserow.core.models import Application, Group, GroupUser, Template
from baserow.core.registries import application_type_registry
from baserow.core.trash.handler import TrashHandler
from baserow.core.utils import ChildProgressBuilder
class DeleteGroupActionType(ActionType):
class DeleteGroupActionType(UndoableActionType):
type = "delete_group"
description = ActionTypeDescription(
_("Delete group"),
_('Group "%(group_name)s" (%(group_id)s) deleted.'),
)
@dataclasses.dataclass
class Params:
deleted_group_id: int
group_id: int
group_name: str
def do(self, user: AbstractUser, group: GroupForUpdate):
@classmethod
def do(cls, user: AbstractUser, group: GroupForUpdate):
"""
Deletes an existing group and related applications if the user has admin
permissions for the group. See baserow.core.handler.CoreHandler.delete_group
@ -33,7 +50,12 @@ class DeleteGroupActionType(ActionType):
CoreHandler().delete_group(user, group)
self.register_action(user, self.Params(group.id), scope=self.scope())
cls.register_action(
user=user,
params=cls.Params(group.id, group.name),
scope=cls.scope(),
group=group,
)
@classmethod
def scope(cls) -> ActionScopeStr:
@ -49,7 +71,7 @@ class DeleteGroupActionType(ActionType):
TrashHandler.restore_item(
user,
"group",
params.deleted_group_id,
params.group_id,
)
@classmethod
@ -59,11 +81,15 @@ class DeleteGroupActionType(ActionType):
params: Params,
action_to_redo: Action,
):
CoreHandler().delete_group_by_id(user, params.deleted_group_id)
CoreHandler().delete_group_by_id(user, params.group_id)
class CreateGroupActionType(ActionType):
class CreateGroupActionType(UndoableActionType):
type = "create_group"
description = ActionTypeDescription(
_("Create group"),
_('Group "%(group_name)s" (%(group_id)s) created.'),
)
@dataclasses.dataclass
class Params:
@ -82,14 +108,13 @@ class CreateGroupActionType(ActionType):
"""
group_user = CoreHandler().create_group(user, name=group_name)
# noinspection PyTypeChecker
group_id: int = group_user.group_id
group = group_user.group
cls.register_action(
user=user,
params=cls.Params(group_id, group_name),
params=cls.Params(group.id, group_name),
scope=cls.scope(),
group=group,
)
return group_user
@ -118,14 +143,21 @@ class CreateGroupActionType(ActionType):
)
class UpdateGroupActionType(ActionType):
class UpdateGroupActionType(UndoableActionType):
type = "update_group"
description = ActionTypeDescription(
_("Update group"),
_(
"Group (%(group_id)s) name changed from "
'"%(original_group_name)s" to "%(group_name)s."'
),
)
@dataclasses.dataclass
class Params:
group_id: int
group_name: str
original_group_name: str
new_group_name: str
@classmethod
def do(
@ -151,10 +183,11 @@ class UpdateGroupActionType(ActionType):
user=user,
params=cls.Params(
group.id,
group_name=new_group_name,
original_group_name=original_group_name,
new_group_name=new_group_name,
),
scope=cls.scope(),
group=group,
)
return group
@ -187,20 +220,24 @@ class UpdateGroupActionType(ActionType):
CoreHandler().update_group(
user,
group,
name=params.new_group_name,
name=params.group_name,
)
class OrderGroupsActionType(ActionType):
class OrderGroupsActionType(UndoableActionType):
type = "order_groups"
description = ActionTypeDescription(
_("Order groups"),
_("Groups order changed."),
)
@dataclasses.dataclass
class Params:
original_order: List[int]
new_order: List[int]
group_ids: List[int]
original_group_ids: List[int]
@classmethod
def do(cls, user: AbstractUser, group_ids: List[int]) -> None:
def do(cls, user: AbstractUser, group_ids_in_order: List[int]) -> None:
"""
Changes the order of groups for a user.
See baserow.core.handler.CoreHandler.order_groups for more details. Undoing
@ -211,15 +248,15 @@ class OrderGroupsActionType(ActionType):
:param group_ids: The ids of the groups to order.
"""
original_order = CoreHandler().get_groups_order(user)
original_group_ids_in_order = CoreHandler().get_groups_order(user)
CoreHandler().order_groups(user, group_ids)
CoreHandler().order_groups(user, group_ids_in_order)
cls.register_action(
user=user,
params=cls.Params(
original_order,
new_order=group_ids,
group_ids_in_order,
original_group_ids_in_order,
),
scope=cls.scope(),
)
@ -235,7 +272,7 @@ class OrderGroupsActionType(ActionType):
params: Params,
action_to_undo: Action,
):
CoreHandler().order_groups(user, params.original_order)
CoreHandler().order_groups(user, params.original_group_ids)
@classmethod
def redo(
@ -244,17 +281,21 @@ class OrderGroupsActionType(ActionType):
params: Params,
action_to_redo: Action,
):
CoreHandler().order_groups(user, params.new_order)
CoreHandler().order_groups(user, params.group_ids)
class OrderApplicationsActionType(ActionType):
class OrderApplicationsActionType(UndoableActionType):
type = "order_applications"
description = ActionTypeDescription(
_("Order applications"), _("Applications reordered"), GROUP_CONTEXT
)
@dataclasses.dataclass
class Params:
group_id: int
group_name: str
application_ids: List[int]
original_application_ids: List[int]
new_application_ids: List[int]
@classmethod
def do(
@ -272,16 +313,17 @@ class OrderApplicationsActionType(ActionType):
:param application_ids_in_order: A list of ids in the new order.
"""
old_ids_in_order = list(
original_application_ids_in_order = list(
CoreHandler().order_applications(user, group, application_ids_in_order)
)
params = cls.Params(
group_id=group.id,
original_application_ids=old_ids_in_order,
new_application_ids=application_ids_in_order,
group.id,
group.name,
application_ids_in_order,
original_application_ids_in_order,
)
cls.register_action(user, params, cls.scope(group.id))
cls.register_action(user, params, scope=cls.scope(group.id), group=group)
@classmethod
def scope(cls, group_id: int) -> ActionScopeStr:
@ -295,15 +337,25 @@ class OrderApplicationsActionType(ActionType):
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_being_redone: Action):
group = CoreHandler().get_group_for_update(params.group_id)
CoreHandler().order_applications(user, group, params.new_application_ids)
CoreHandler().order_applications(user, group, params.application_ids)
class CreateApplicationActionType(ActionType):
class CreateApplicationActionType(UndoableActionType):
type = "create_application"
description = ActionTypeDescription(
_("Create application"),
_('"%(application_name)s" (%(application_id)s) %(application_type)s created'),
GROUP_CONTEXT,
)
@dataclasses.dataclass
class Params:
group_id: int
group_name: str
application_type: str
application_id: int
application_name: str
with_data: bool
@classmethod
def do(
@ -332,8 +384,19 @@ class CreateApplicationActionType(ActionType):
user, group, application_type, name=name, init_with_data=init_with_data
)
params = cls.Params(application.id)
cls.register_action(user, params, cls.scope(group.id))
application_type = application_type_registry.get_by_model(
application.specific_class
)
params = cls.Params(
group.id,
group.name,
application_type.type,
application.id,
application.name,
init_with_data,
)
cls.register_action(user, params, scope=cls.scope(group.id), group=group)
return application
@ -353,12 +416,24 @@ class CreateApplicationActionType(ActionType):
)
class DeleteApplicationActionType(ActionType):
class DeleteApplicationActionType(UndoableActionType):
type = "delete_application"
description = ActionTypeDescription(
_("Delete application"),
_(
'Application "%(application_name)s" (%(application_id)s) of type '
"%(application_type)s deleted"
),
GROUP_CONTEXT,
)
@dataclasses.dataclass
class Params:
group_id: int
group_name: str
application_type: str
application_id: int
application_name: str
@classmethod
def do(cls, user: AbstractUser, application: Application) -> None:
@ -374,8 +449,20 @@ class DeleteApplicationActionType(ActionType):
CoreHandler().delete_application(user, application)
params = cls.Params(application.id)
cls.register_action(user, params, cls.scope(application.group.id))
group = application.group
application_type = application_type_registry.get_by_model(
application.specific_class
)
params = cls.Params(
group.id,
group.name,
application_type.type,
application.id,
application.name,
)
cls.register_action(
user, params, scope=cls.scope(application.group.id), group=group
)
@classmethod
def scope(cls, group_id: int) -> ActionScopeStr:
@ -393,14 +480,25 @@ class DeleteApplicationActionType(ActionType):
CoreHandler().delete_application(user, application)
class UpdateApplicationActionType(ActionType):
class UpdateApplicationActionType(UndoableActionType):
type = "update_application"
description = ActionTypeDescription(
_("Update application"),
_(
"Application (%(application_id)s) of type %(application_type)s renamed "
'from "%(original_application_name)s" to "%(application_name)s"'
),
GROUP_CONTEXT,
)
@dataclasses.dataclass
class Params:
group_id: int
group_name: str
application_type: str
application_id: int
original_name: str
new_name: str
application_name: str
original_application_name: str
@classmethod
def do(cls, user: AbstractUser, application: Application, name: str) -> Application:
@ -419,9 +517,22 @@ class UpdateApplicationActionType(ActionType):
original_name = application.name
application = CoreHandler().update_application(user, application, name)
application_type = application_type_registry.get_by_model(
application.specific_class
)
group = application.group
params = cls.Params(application.id, original_name, name)
cls.register_action(user, params, cls.scope(application.group.id))
params = cls.Params(
group.id,
group.name,
application_type.type,
application.id,
name,
original_name,
)
cls.register_action(
user, params, scope=cls.scope(application.group.id), group=group
)
return application
@ -432,20 +543,36 @@ class UpdateApplicationActionType(ActionType):
@classmethod
def undo(cls, user: AbstractUser, params: Params, action_being_undone: Action):
application = CoreHandler().get_application(params.application_id)
CoreHandler().update_application(user, application, params.original_name)
CoreHandler().update_application(
user, application, params.original_application_name
)
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_being_redone: Action):
application = CoreHandler().get_application(params.application_id)
CoreHandler().update_application(user, application, params.new_name)
CoreHandler().update_application(user, application, params.application_name)
class DuplicateApplicationActionType(ActionType):
class DuplicateApplicationActionType(UndoableActionType):
type = "duplicate_application"
description = ActionTypeDescription(
_("Duplicate application"),
_(
'Application "%(application_name)s" (%(application_id)s) of type %(application_type)s '
'duplicated from "%(original_application_name)s" (%(original_application_id)s)'
),
GROUP_CONTEXT,
)
@dataclasses.dataclass
class Params:
group_id: int
group_name: str
application_type: str
application_id: int
application_name: str
original_application_id: int
original_application_name: str
@classmethod
def do(
@ -466,16 +593,28 @@ class DuplicateApplicationActionType(ActionType):
:return: The new (duplicated) application instance.
"""
new_application_clone = CoreHandler().duplicate_application(
new_app_clone = CoreHandler().duplicate_application(
user,
application,
progress_builder,
)
application_type = application_type_registry.get_by_model(
application.specific_class
)
group = application.group
params = cls.Params(new_application_clone.id)
cls.register_action(user, params, cls.scope(application.group.id))
params = cls.Params(
group.id,
group.name,
application_type.type,
new_app_clone.id,
new_app_clone.name,
application.id,
application.name,
)
cls.register_action(user, params, cls.scope(application.group.id), group=group)
return new_application_clone
return new_app_clone
@classmethod
def scope(cls, group_id: int) -> ActionScopeStr:
@ -493,12 +632,24 @@ class DuplicateApplicationActionType(ActionType):
)
class InstallTemplateActionType(ActionType):
class InstallTemplateActionType(UndoableActionType):
type = "install_template"
description = ActionTypeDescription(
_("Install template"),
_(
'Template "%(template_name)s" (%(template_id)s) installed '
"into application IDs %(installed_application_ids)s"
),
GROUP_CONTEXT,
)
@dataclasses.dataclass
class Params:
installed_applications_ids: List[int]
group_id: int
group_name: str
template_id: int
template_name: str
installed_application_ids: List[int]
@classmethod
def do(
@ -529,8 +680,14 @@ class InstallTemplateActionType(ActionType):
progress_builder=progress_builder,
)
params = cls.Params([app.id for app in installed_applications])
cls.register_action(user, params, cls.scope(group.id))
params = cls.Params(
group.id,
group.name,
template.id,
template.name,
[app.id for app in installed_applications],
)
cls.register_action(user, params, scope=cls.scope(group.id), group=group)
return installed_applications
@ -541,13 +698,13 @@ class InstallTemplateActionType(ActionType):
@classmethod
def undo(cls, user: AbstractUser, params: Params, action_being_undone: Action):
handler = CoreHandler()
for application_id in params.installed_applications_ids:
for application_id in params.installed_application_ids:
application = CoreHandler().get_application(application_id)
handler.delete_application(user, application)
@classmethod
def redo(cls, user: AbstractUser, params: Params, action_being_redone: Action):
for application_id in params.installed_applications_ids:
for application_id in params.installed_application_ids:
TrashHandler.restore_item(
user, "application", application_id, parent_trash_item_id=None
)

24
backend/src/baserow/core/apps.py Normal file → Executable file
View file

@ -159,6 +159,28 @@ class CoreConfig(AppConfig):
action_type_registry.register(DuplicateApplicationActionType())
action_type_registry.register(InstallTemplateActionType())
from baserow.core.snapshots.actions import (
CreateSnapshotActionType,
DeleteSnapshotActionType,
RestoreSnapshotActionType,
)
action_type_registry.register(CreateSnapshotActionType())
action_type_registry.register(DeleteSnapshotActionType())
action_type_registry.register(RestoreSnapshotActionType())
from baserow.core.user.actions import (
CancelUserDeletionActionType,
CreateUserActionType,
ScheduleUserDeletionActionType,
UpdateUserActionType,
)
action_type_registry.register(CreateUserActionType())
action_type_registry.register(UpdateUserActionType())
action_type_registry.register(ScheduleUserDeletionActionType())
action_type_registry.register(CancelUserDeletionActionType())
from baserow.core.action.scopes import (
ApplicationActionScopeType,
GroupActionScopeType,
@ -172,7 +194,7 @@ class CoreConfig(AppConfig):
from baserow.core.jobs.registries import job_type_registry
from .job_types import DuplicateApplicationJobType, InstallTemplateJobType
from .snapshots.job_type import CreateSnapshotJobType, RestoreSnapshotJobType
from .snapshots.job_types import CreateSnapshotJobType, RestoreSnapshotJobType
job_type_registry.register(DuplicateApplicationJobType())
job_type_registry.register(InstallTemplateJobType())

View file

@ -113,7 +113,7 @@ class JobHandler:
states_q |= Q(state=state)
return states_q
queryset = Job.objects.filter(user=user)
queryset = Job.objects.filter(user=user).order_by("-updated_on")
if filter_states:
queryset = queryset.filter(get_job_states_filter(filter_states))

View file

@ -6,8 +6,10 @@ from django.db import models
from baserow.api.sessions import (
get_client_undo_redo_action_group_id,
get_untrusted_client_session_id,
get_user_remote_addr_ip,
set_client_undo_redo_action_group_id,
set_untrusted_client_session_id,
set_user_remote_addr_ip,
)
@ -61,6 +63,37 @@ class JobWithUserDataMixin(models.Model):
abstract = True
class JobWithUserIpAddress(JobWithUserDataMixin):
user_ip_address = models.GenericIPAddressField(
null=True, help_text="The user IP address."
)
def _save_user_data_if_not_present(self, user: AbstractUser) -> None:
"""
Save the user session in the job so to be able to restore.
Call this in a request context and not from a celery job or other contexts.
:param user: The user to save the data for.
"""
if getattr(self, "user_ip_address") is None:
self.user_ip_address = get_user_remote_addr_ip(user)
def _restore_user_data_if_present(self, user: AbstractUser) -> None:
"""
Restore the user session in the job so to be able to restore.
:param user: The user to restore the data for.
"""
if getattr(self, "user_ip_address") is not None:
set_user_remote_addr_ip(user, self.user_ip_address)
class Meta:
abstract = True
class JobWithWebsocketId(JobWithUserDataMixin):
"""
This mixin add the websocket id to the job so that actions and handlers can

View file

@ -87,3 +87,4 @@ class Job(CreatedAndUpdatedOnMixin, PolymorphicContentTypeMixin, models.Model):
class Meta:
ordering = ("id",)
indexes = [models.Index(fields=["-updated_on"])]

View file

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-01-26 16:55+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -13,11 +13,150 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.11-dev\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr ""
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr ""
@ -34,6 +173,9 @@ msgid "Accept invitation"
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -41,6 +183,46 @@ msgid ""
"developer without leaving your browser."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, python-format
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, python-format
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, python-format
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -62,11 +244,65 @@ msgid ""
"hours."
msgstr ""
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr ""

View file

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:45+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-22 09:50+0100\n"
"Last-Translator: Natthapon <natthapon@wagner-international.com>\n"
"Language-Team: German <https://hosted.weblate.org/projects/baserow/backend-"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 3.0.1\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s hat dich zu %(group_name)s eingeladen - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Einladung"
@ -37,6 +176,9 @@ msgid "Accept invitation"
msgstr "Einladung annehmen"
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -47,6 +189,67 @@ msgstr ""
"Zusammenarbeit mit über Projekte, Kunden und mehr. Es gibt Ihnen die "
"Befugnisse eines Entwicklers ohne Ihren Browser zu verlassen."
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"Ein Passwort-Reset wurde für Ihr Konto ( %(username)s) beantragt am Baserow "
"(%(public_web_frontend_hostname)s). Wenn Sie dies nicht autorisiert haben, "
"können Sie diese E-Mail einfach ignorieren."
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
"Ein Passwort-Reset wurde für Ihr Konto ( %(username)s) beantragt am Baserow "
"(%(public_web_frontend_hostname)s). Wenn Sie dies nicht autorisiert haben, "
"können Sie diese E-Mail einfach ignorieren."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
"Ein Passwort-Reset wurde für Ihr Konto ( %(username)s) beantragt am Baserow "
"(%(public_web_frontend_hostname)s). Wenn Sie dies nicht autorisiert haben, "
"können Sie diese E-Mail einfach ignorieren."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -74,11 +277,65 @@ msgstr ""
"auf die untenstehende Schaltfläche, und Sie können Sie Ihr Passwort ändern. "
"Dieser Link läuft ab in %(hours)s Stunden."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Passwort zurücksetzen - Baserow"
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s's Gruppe"

View file

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-04 11:05+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,11 +18,150 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr ""
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr ""
@ -110,6 +249,48 @@ msgid ""
"hours."
msgstr ""
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr ""
@ -126,7 +307,7 @@ msgstr ""
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:173
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr ""

BIN
backend/src/baserow/core/locale/es/LC_MESSAGES/django.mo Normal file → Executable file

Binary file not shown.

View file

@ -2,11 +2,11 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:45+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-11-22 14:48+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/baserow/"
"backend-core/es/>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/baserow/backend-"
"core/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15-dev\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s le invitó a %(group_name)s - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Invitación"
@ -29,14 +168,17 @@ msgid ""
"<strong>%(first_name)s</strong> has invited you to collaborate on <strong>"
"%(group_name)s</strong>."
msgstr ""
"<strong>%(first_name)s</strong> te ha invitado a colaborar en "
"<strong>%(group_name)s</strong>."
"<strong>%(first_name)s</strong> te ha invitado a colaborar en <strong>"
"%(group_name)s</strong>."
#: src/baserow/core/templates/baserow/core/group_invitation.html:165
msgid "Accept invitation"
msgstr "Aceptar la invitación"
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -47,6 +189,67 @@ msgstr ""
"le permite colaborar en proyectos, clientes y más. Te da los poderes de un "
"desarrollador sin dejando su navegador."
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"Se solicitó un restablecimiento de contraseña para su cuenta (%(username)s) "
"el Baserow (%(public_web_frontend_hostname)s). Si no autorizó esto, "
"simplemente puede ignorar este correo electrónico."
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
"Se solicitó un restablecimiento de contraseña para su cuenta (%(username)s) "
"el Baserow (%(public_web_frontend_hostname)s). Si no autorizó esto, "
"simplemente puede ignorar este correo electrónico."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
"Se solicitó un restablecimiento de contraseña para su cuenta (%(username)s) "
"el Baserow (%(public_web_frontend_hostname)s). Si no autorizó esto, "
"simplemente puede ignorar este correo electrónico."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -74,11 +277,65 @@ msgstr ""
"clic en el botón a continuación y podrá cambiar su contraseña. Este enlace "
"caducará en %(hours)s horas."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Restablecer contraseña - Baserow"
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s grupo"

View file

View file

@ -2,11 +2,11 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-30 13:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-07-05 11:27+0000\n"
"Last-Translator: Jérémie Pardou-Piquemal <jrmi@jeremiez.net>\n"
"Language-Team: French <https://hosted.weblate.org/projects/baserow/"
"backend-core/fr/>\n"
"Language-Team: French <https://hosted.weblate.org/projects/baserow/backend-"
"core/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.13.1-dev\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s vous a invité à %(group_name)s - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Invitation"
@ -127,6 +266,48 @@ msgstr ""
"cliquer sur le bouton ci-dessous, et vous vous pourrez modifier votre mot de "
"passe. Ce lien expirera dans %(hours)s heures."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Réinitialiser le mot de passe - Baserow"
@ -143,7 +324,7 @@ msgstr "Compte supprimé définitivement - Baserow"
msgid "Account deletion cancelled - Baserow"
msgstr "Suppression du compte annulée - Baserow"
#: src/baserow/core/user/handler.py:169
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "Groupe de %(name)s"

View file

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-22 09:55+0100\n"
"Last-Translator: Sara Cinacchi <sara.cinacchi@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/baserow/backend-"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 3.0.1\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s ti ha imvitato su %(group_name)s - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Invito"
@ -37,6 +176,9 @@ msgid "Accept invitation"
msgstr "Accetta invito"
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -47,6 +189,67 @@ msgstr ""
"progetti, clienti ed altro. Ti da i \"poteri\" di uno sviluppatore senza "
"lasciare il tuo browser."
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"Una richiesta di reimpostare la password é stata richiesta per il tuo "
"account (%(username)s) su Baserow (%(public_web_frontend_hostname)s). Se non "
"hai autorizzato questa richiesta, puoi semplicemente ignorare qiesta email."
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
"Una richiesta di reimpostare la password é stata richiesta per il tuo "
"account (%(username)s) su Baserow (%(public_web_frontend_hostname)s). Se non "
"hai autorizzato questa richiesta, puoi semplicemente ignorare qiesta email."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
"Una richiesta di reimpostare la password é stata richiesta per il tuo "
"account (%(username)s) su Baserow (%(public_web_frontend_hostname)s). Se non "
"hai autorizzato questa richiesta, puoi semplicemente ignorare qiesta email."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -74,11 +277,65 @@ msgstr ""
"sotto, e potrai cambiare la tua password. Questo link scadrà in %(hours)s "
"ore."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Reimposta password -Baserow"
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s del gruppo"

Binary file not shown.

View file

@ -2,11 +2,11 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-30 13:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-11-28 18:47+0000\n"
"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n"
"Language-Team: Marathi <https://hosted.weblate.org/projects/baserow/"
"backend-core/mr/>\n"
"Language-Team: Marathi <https://hosted.weblate.org/projects/baserow/backend-"
"core/mr/>\n"
"Language: mr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15-dev\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s ने तुम्हाला %(group_name)s - Baserow वर आमंत्रित केले आहे"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "आमंत्रण"
@ -29,8 +168,8 @@ msgid ""
"<strong>%(first_name)s</strong> has invited you to collaborate on <strong>"
"%(group_name)s</strong>."
msgstr ""
"<strong>%(first_name)s</strong> ने तुम्हाला <strong>%(group_name)s</strong> "
"वर सहयोग करण्यासाठी आमंत्रित केले आहे."
"<strong>%(first_name)s</strong> ने तुम्हाला <strong>%(group_name)s</strong> वर "
"सहयोग करण्यासाठी आमंत्रित केले आहे."
#: src/baserow/core/templates/baserow/core/group_invitation.html:165
msgid "Accept invitation"
@ -46,9 +185,9 @@ msgid ""
"collaborate on projects, customers and more. It gives you the powers of a "
"developer without leaving your browser."
msgstr ""
"Baserow हे ओपन सोर्स नो-कोड डेटाबेस टूल आहे जे तुम्हाला प्रकल्प(प्रोजेक्ट), "
"ग्राहक आणि इतर बऱ्याच बाबतींत सहयोग करण्यास अनुमती देते. हे तुम्हाला तुमचा "
"ब्राउझर न सोडता विकसकाचे अधिकार देते."
"Baserow हे ओपन सोर्स नो-कोड डेटाबेस टूल आहे जे तुम्हाला प्रकल्प(प्रोजेक्ट), ग्राहक आणि इतर "
"बऱ्याच बाबतींत सहयोग करण्यास अनुमती देते. हे तुम्हाला तुमचा ब्राउझर न सोडता विकसकाचे "
"अधिकार देते."
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
@ -60,8 +199,8 @@ msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"Baserow (%(public_web_frontend_hostname)s) वरील तुमचे खाते (%(username)s) "
"कायमचे हटवले गेले आहे."
"Baserow (%(public_web_frontend_hostname)s) वरील तुमचे खाते (%(username)s) कायमचे "
"हटवले गेले आहे."
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
@ -75,8 +214,7 @@ msgid ""
"cancelled."
msgstr ""
"Baserow (%(public_web_frontend_hostname)s) वरील आपले खाते (%(username)s) "
"हटविण्यासाठी प्रलंबित होते, परंतु आपण लॉग इन केले आहे म्हणून हे ऑपरेशन रद्द "
"केले गेले आहे."
"हटविण्यासाठी प्रलंबित होते, परंतु आपण लॉग इन केले आहे म्हणून हे ऑपरेशन रद्द केले गेले आहे."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
@ -96,8 +234,8 @@ msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
"जर तुम्ही तुमचा विचार बदलला असेल आणि तुमचे खाते हटवणे रद्द करायचे असेल, तर "
"तुम्हाला फक्त पुन्हा लॉग इन करावे लागेल."
"जर तुम्ही तुमचा विचार बदलला असेल आणि तुमचे खाते हटवणे रद्द करायचे असेल, तर तुम्हाला फक्त "
"पुन्हा लॉग इन करावे लागेल."
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
@ -112,8 +250,8 @@ msgid ""
"simply ignore this email."
msgstr ""
"बेसरोवर (%(public_web_frontend_hostname)s) तुमच्या खात्यासाठी (%(username)s) "
"पासवर्ड रीसेट करण्याची विनंती केली गेली होती. तुम्ही हे अधिकृत केले नसल्यास, "
"तुम्ही या ईमेलकडे दुर्लक्ष करू शकता."
"पासवर्ड रीसेट करण्याची विनंती केली गेली होती. तुम्ही हे अधिकृत केले नसल्यास, तुम्ही या "
"ईमेलकडे दुर्लक्ष करू शकता."
#: src/baserow/core/templates/baserow/core/user/reset_password.html:156
#, python-format
@ -122,8 +260,50 @@ msgid ""
"will be able to change your password. This link will expire in %(hours)s "
"hours."
msgstr ""
"तुमचा पासवर्ड रीसेट सुरू ठेवण्यासाठी, फक्त खालील बटणावर क्लिक करा आणि तुम्ही "
"तुमचा पासवर्ड बदलण्यास सक्षम असाल. ही लिंक %(hours)s तासांत कालबाह्य होईल."
"तुमचा पासवर्ड रीसेट सुरू ठेवण्यासाठी, फक्त खालील बटणावर क्लिक करा आणि तुम्ही तुमचा "
"पासवर्ड बदलण्यास सक्षम असाल. ही लिंक %(hours)s तासांत कालबाह्य होईल."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
@ -141,7 +321,7 @@ msgstr "खाते कायमचे हटवले - Baserow"
msgid "Account deletion cancelled - Baserow"
msgstr "खाते हटविणे रद्द केले - Baserow"
#: src/baserow/core/user/handler.py:169
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s चा गट"

View file

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-22 09:57+0100\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/baserow/"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 3.0.1\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s Inviterte deg til %(group_name)s — Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Invitasjon"
@ -37,6 +176,9 @@ msgid "Accept invitation"
msgstr "Godta invitasjon"
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -47,6 +189,67 @@ msgstr ""
"prosjekter, kunder, med mer. Det gir deg utviklermuligheter uten å forlate "
"nettleseren."
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"Passordtilbakestilling forespurt for kontoen din (%(username)s) på Baserow "
"(%(public_web_frontend_hostname)s). Hvis du ikke utførte dette, kan du se "
"bort fra denne e-posten."
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
"Passordtilbakestilling forespurt for kontoen din (%(username)s) på Baserow "
"(%(public_web_frontend_hostname)s). Hvis du ikke utførte dette, kan du se "
"bort fra denne e-posten."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
"Passordtilbakestilling forespurt for kontoen din (%(username)s) på Baserow "
"(%(public_web_frontend_hostname)s). Hvis du ikke utførte dette, kan du se "
"bort fra denne e-posten."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -73,11 +276,65 @@ msgstr ""
"For å fortsette tilbakestilling av passord kan du klikke på knappen nedenfor "
"for å endre passordet ditt. Lenken vil utløpe om %(hours)s timer."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Tilbakestill passord — Baserow"
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s sin gruppe"

View file

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:46+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-22 10:03+0100\n"
"Last-Translator: Bram <bram@baserow.io>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/baserow/backend-"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 3.0.1\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s heeft je uitgenodigd voor %(group_name)s - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Uitnodiging"
@ -37,6 +176,9 @@ msgid "Accept invitation"
msgstr "Uitnodiging accepteren"
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -47,6 +189,67 @@ msgstr ""
"samenwerken aan projecten, klanten en nog veel meer. Je hebt de kracht van "
"een ontwikkelaar zonder de browser te verlaten."
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"Een verzoek voor het aanmaken van een nieuw wachtwoord is ontvangen voor je "
"account (%(username)s) op Baserow (%(public_web_frontend_hostname)s). Als "
"dit zonder jouw toestemming gebeurde, kun je deze e-mail gewoon negeren."
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
"Een verzoek voor het aanmaken van een nieuw wachtwoord is ontvangen voor je "
"account (%(username)s) op Baserow (%(public_web_frontend_hostname)s). Als "
"dit zonder jouw toestemming gebeurde, kun je deze e-mail gewoon negeren."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
"Een verzoek voor het aanmaken van een nieuw wachtwoord is ontvangen voor je "
"account (%(username)s) op Baserow (%(public_web_frontend_hostname)s). Als "
"dit zonder jouw toestemming gebeurde, kun je deze e-mail gewoon negeren."
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -73,11 +276,65 @@ msgstr ""
"Maak een nieuw wachtwoord aan door te klikken op de knop hieronder. Dan kun "
"je je wachtwoord veranderen. Deze link is %(hours)s uur geldig."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Nieuw wachtwoord aanmaken - Baserow"
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "Groep van %(name)s"

View file

View file

@ -2,11 +2,11 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-30 13:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-08-09 17:15+0000\n"
"Last-Translator: PiotrEsse <piotr.esse@spero.click>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/baserow/"
"backend-core/pl/>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/baserow/backend-"
"core/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -15,11 +15,150 @@ msgstr ""
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.14-dev\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s zaprosił Ciebie do %(group_name)s - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Zaproszenie"
@ -30,8 +169,8 @@ msgid ""
"<strong>%(first_name)s</strong> has invited you to collaborate on <strong>"
"%(group_name)s</strong>."
msgstr ""
"<strong>%(first_name)s</strong> zaprosił cię do współpracy w "
"<strong>%(group_name)s</strong>."
"<strong>%(first_name)s</strong> zaprosił cię do współpracy w <strong>"
"%(group_name)s</strong>."
#: src/baserow/core/templates/baserow/core/group_invitation.html:165
msgid "Accept invitation"
@ -126,6 +265,48 @@ msgstr ""
"Aby kontynuować resetowanie hasła, wystarczy kliknąć poniższy przycisk, a "
"będziesz mógł zmienić swoje hasło. Ten link wygaśnie za %(hours)s godziy/n."
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Resetowanie hasła - Baserow"
@ -142,7 +323,7 @@ msgstr "Konto trwale usunięte - Baserow"
msgid "Account deletion cancelled - Baserow"
msgstr "Usunięcie konta anulowane - Baserow"
#: src/baserow/core/user/handler.py:169
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "Grupa %(name)s"

Binary file not shown.

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-28 20:39+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-21 19:14+0000\n"
"Last-Translator: James Braves <dubavy@zetmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
@ -14,22 +14,165 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.12-dev\n"
#: src/baserow/core/emails.py:88
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s convidou você para o %(group_name)s - Baserow"
#: src/baserow/core/templates/baserow/core/group_invitation.html:7
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "Convite"
#: src/baserow/core/templates/baserow/core/group_invitation.html:9
#, python-format
#: src/baserow/core/templates/baserow/core/group_invitation.html:151
#, fuzzy, python-format
#| msgid ""
#| "\n"
#| " <strong>%(first_name)s</strong> has invited you to collaborate "
#| "on\n"
#| " <strong>%(group_name)s</strong>.\n"
#| " "
msgid ""
"\n"
" <strong>%(first_name)s</strong> has invited you to collaborate on\n"
" <strong>%(group_name)s</strong>.\n"
" "
"<strong>%(first_name)s</strong> has invited you to collaborate on <strong>"
"%(group_name)s</strong>."
msgstr ""
"\n"
" <strong>%(first_name)s</strong> tem um convite para você colaborar "
@ -37,20 +180,28 @@ msgstr ""
" <strong>%(group_name)s</strong>.\n"
" "
#: src/baserow/core/templates/baserow/core/group_invitation.html:20
#: src/baserow/core/templates/baserow/core/group_invitation.html:165
msgid "Accept invitation"
msgstr "Aceitar convite"
#: src/baserow/core/templates/baserow/core/group_invitation.html:26
#: src/baserow/core/templates/baserow/core/user/reset_password.html:29
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
#, fuzzy
#| msgid ""
#| "\n"
#| " Baserow is an open source no-code database tool which allows "
#| "you to collaborate\n"
#| " on projects, customers and more. It gives you the powers of a "
#| "developer without\n"
#| " leaving your browser.\n"
#| " "
msgid ""
"\n"
" Baserow is an open source no-code database tool which allows you "
"to collaborate\n"
" on projects, customers and more. It gives you the powers of a "
"developer without\n"
" leaving your browser.\n"
" "
"Baserow is an open source no-code database tool which allows you to "
"collaborate on projects, customers and more. It gives you the powers of a "
"developer without leaving your browser."
msgstr ""
"\n"
" Baserow é uma ferramenta de banco de dados de código-aberto e no-"
@ -60,20 +211,65 @@ msgstr ""
" sem sair do seu navegador.\n"
" "
#: src/baserow/core/templates/baserow/core/user/reset_password.html:7
#: src/baserow/core/templates/baserow/core/user/reset_password.html:23
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, python-format
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, python-format
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, python-format
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
msgstr "Resetar senha"
#: src/baserow/core/templates/baserow/core/user/reset_password.html:9
#, python-format
#: src/baserow/core/templates/baserow/core/user/reset_password.html:151
#, fuzzy, python-format
#| msgid ""
#| "\n"
#| " A password reset was requested for your account (%(username)s) "
#| "on\n"
#| " Baserow (%(public_web_frontend_hostname)s). If you did not "
#| "authorize this,\n"
#| " you may simply ignore this email.\n"
#| " "
msgid ""
"\n"
" A password reset was requested for your account (%(username)s) on\n"
" Baserow (%(public_web_frontend_hostname)s). If you did not "
"authorize this,\n"
" you may simply ignore this email.\n"
" "
"A password reset was requested for your account (%(username)s) on Baserow "
"(%(public_web_frontend_hostname)s). If you did not authorize this, you may "
"simply ignore this email."
msgstr ""
"\n"
" Uma redefinição de senha foi solicitada para sua conta "
@ -83,15 +279,19 @@ msgstr ""
" você pode simplesmente ignorar este e-mail.\n"
" "
#: src/baserow/core/templates/baserow/core/user/reset_password.html:16
#, python-format
#: src/baserow/core/templates/baserow/core/user/reset_password.html:156
#, fuzzy, python-format
#| msgid ""
#| "\n"
#| " To continue with your password reset, simply click the button "
#| "below, and you\n"
#| " will be able to change your password. This link will expire in\n"
#| " %(hours)s hours.\n"
#| " "
msgid ""
"\n"
" To continue with your password reset, simply click the button "
"below, and you\n"
" will be able to change your password. This link will expire in\n"
" %(hours)s hours.\n"
" "
"To continue with your password reset, simply click the button below, and you "
"will be able to change your password. This link will expire in %(hours)s "
"hours."
msgstr ""
"\n"
" Para continuar com sua redefinição de senha, basta clicar no botão "
@ -100,11 +300,65 @@ msgstr ""
" %(hours)s hours.\n"
" "
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "Resetar senha - Baserow"
#: src/baserow/core/user/handler.py:155
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s's grupo"

Binary file not shown.

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-30 13:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-07-05 11:27+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -14,11 +14,150 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.13.1-dev\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr ""
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr ""
@ -106,6 +245,48 @@ msgid ""
"hours."
msgstr ""
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr ""
@ -122,7 +303,7 @@ msgstr ""
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:169
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr ""

View file

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-22 08:52+0000\n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: 2022-04-22 10:00+0100\n"
"Last-Translator: Joey Li <joeyli16@icloud.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
@ -14,11 +14,150 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.0.1\n"
#: src/baserow/core/action/scopes.py:9
#, python-format
msgid "in group \"%(group_name)s\" (%(group_id)s)."
msgstr ""
#: src/baserow/core/actions.py:29
msgid "Delete group"
msgstr ""
#: src/baserow/core/actions.py:30
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) deleted."
msgstr ""
#: src/baserow/core/actions.py:90
msgid "Create group"
msgstr ""
#: src/baserow/core/actions.py:91
#, python-format
msgid "Group \"%(group_name)s\" (%(group_id)s) created."
msgstr ""
#: src/baserow/core/actions.py:149
msgid "Update group"
msgstr ""
#: src/baserow/core/actions.py:151
#, python-format
msgid ""
"Group (%(group_id)s) name changed from \"%(original_group_name)s\" to "
"\"%(group_name)s.\""
msgstr ""
#: src/baserow/core/actions.py:230
msgid "Order groups"
msgstr ""
#: src/baserow/core/actions.py:231
msgid "Groups order changed."
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Order applications"
msgstr ""
#: src/baserow/core/actions.py:290
msgid "Applications reordered"
msgstr ""
#: src/baserow/core/actions.py:346
msgid "Create application"
msgstr ""
#: src/baserow/core/actions.py:347
#, python-format
msgid ""
"\"%(application_name)s\" (%(application_id)s) %(application_type)s created"
msgstr ""
#: src/baserow/core/actions.py:422
msgid "Delete application"
msgstr ""
#: src/baserow/core/actions.py:424
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s deleted"
msgstr ""
#: src/baserow/core/actions.py:486
msgid "Update application"
msgstr ""
#: src/baserow/core/actions.py:488
#, python-format
msgid ""
"Application (%(application_id)s) of type %(application_type)s renamed from "
"\"%(original_application_name)s\" to \"%(application_name)s\""
msgstr ""
#: src/baserow/core/actions.py:559
msgid "Duplicate application"
msgstr ""
#: src/baserow/core/actions.py:561
#, python-format
msgid ""
"Application \"%(application_name)s\" (%(application_id)s) of type "
"%(application_type)s duplicated from \"%(original_application_name)s"
"\" (%(original_application_id)s)"
msgstr ""
#: src/baserow/core/actions.py:638
msgid "Install template"
msgstr ""
#: src/baserow/core/actions.py:640
#, python-format
msgid ""
"Template \"%(template_name)s\" (%(template_id)s) installed into application "
"IDs %(installed_application_ids)s"
msgstr ""
#: src/baserow/core/emails.py:96
#, python-format
msgid "%(by)s invited you to %(group_name)s - Baserow"
msgstr "%(by)s 邀请你加入 %(group_name)s - Baserow"
#: src/baserow/core/snapshots/actions.py:21
msgid "Create Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:23
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) created for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:68
msgid "Restore Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:70
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) restored from application "
"\"%(original_application_name)s\" (%(original_application_id)s) to "
"application \"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/snapshots/actions.py:124
msgid "Delete Snapshot"
msgstr ""
#: src/baserow/core/snapshots/actions.py:126
#, python-format
msgid ""
"Snapshot \"%(snapshot_name)s\" (%(snapshot_id)s) deleted for application "
"\"%(application_name)s\" (%(application_id)s)."
msgstr ""
#: src/baserow/core/templates/baserow/core/group_invitation.html:146
msgid "Invitation"
msgstr "邀请"
@ -36,6 +175,9 @@ msgid "Accept invitation"
msgstr "接受邀请"
#: src/baserow/core/templates/baserow/core/group_invitation.html:179
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:156
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:161
#: src/baserow/core/templates/baserow/core/user/reset_password.html:179
msgid ""
"Baserow is an open source no-code database tool which allows you to "
@ -45,6 +187,64 @@ msgstr ""
"Baserow 是一个开源的无代码数据库工具,允许你在项目、客户和其他方面进行协作。"
"它让你在不离开浏览器的情况下拥有开发者的权力。"
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:146
msgid "Account permanently deleted"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deleted.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"has been permanently deleted."
msgstr ""
"你在 Baserow (%(public_web_frontend_hostname)s) 上的 (%(username)s) 账户正在"
"请求重置密码。 如果你并未授权本次操作,可以忽略本封邮件。"
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:146
msgid "Account deletion cancelled"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_cancelled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"was pending deletion, but you've logged in so this operation has been "
"cancelled."
msgstr ""
"你在 Baserow (%(public_web_frontend_hostname)s) 上的 (%(username)s) 账户正在"
"请求重置密码。 如果你并未授权本次操作,可以忽略本封邮件。"
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:146
msgid "Account pending deletion"
msgstr ""
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:151
#, fuzzy, python-format
#| msgid ""
#| "A password reset was requested for your account (%(username)s) on Baserow "
#| "(%(public_web_frontend_hostname)s). If you did not authorize this, you "
#| "may simply ignore this email."
msgid ""
"Your account (%(username)s) on Baserow (%(public_web_frontend_hostname)s) "
"will be permanently deleted in %(days_left)s days."
msgstr ""
"你在 Baserow (%(public_web_frontend_hostname)s) 上的 (%(username)s) 账户正在"
"请求重置密码。 如果你并未授权本次操作,可以忽略本封邮件。"
#: src/baserow/core/templates/baserow/core/user/account_deletion_scheduled.html:156
msgid ""
"If you've changed your mind and want to cancel your account deletion, you "
"just have to login again."
msgstr ""
#: src/baserow/core/templates/baserow/core/user/reset_password.html:146
#: src/baserow/core/templates/baserow/core/user/reset_password.html:165
msgid "Reset password"
@ -70,11 +270,65 @@ msgstr ""
"要继续重置密码,只需点击下面的按钮,然后你将能够更改你的密码。此链接将"
"在%(hours)s 小时后失效。"
#: src/baserow/core/user/actions.py:20
msgid "Create User"
msgstr ""
#: src/baserow/core/user/actions.py:22
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) created (via invitation: "
"%(with_invitation_token)s, from template: %(template_id)s)"
msgstr ""
#: src/baserow/core/user/actions.py:92
msgid "Update User"
msgstr ""
#: src/baserow/core/user/actions.py:93
#, python-format
msgid "User \"%(user_email)s\" (%(user_id)s) updated"
msgstr ""
#: src/baserow/core/user/actions.py:136
msgid "Schedule user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:138
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) scheduled to be deleted after grace "
"time"
msgstr ""
#: src/baserow/core/user/actions.py:169
msgid "Cancel user deletion"
msgstr ""
#: src/baserow/core/user/actions.py:171
#, python-format
msgid ""
"User \"%(user_email)s\" (%(user_id)s) logged in cancelling the deletion "
"process"
msgstr ""
#: src/baserow/core/user/emails.py:16
msgid "Reset password - Baserow"
msgstr "重置密码 - Baserow"
#: src/baserow/core/user/handler.py:162
#: src/baserow/core/user/emails.py:37
msgid "Account deletion scheduled - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:56
msgid "Account permanently deleted - Baserow"
msgstr ""
#: src/baserow/core/user/emails.py:74
msgid "Account deletion cancelled - Baserow"
msgstr ""
#: src/baserow/core/user/handler.py:205
#, python-format
msgid "%(name)s's group"
msgstr "%(name)s 的团队"

View file

@ -0,0 +1,21 @@
# Generated by Django 3.2.13 on 2023-01-13 09:53
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0040_alter_groupinvitation_message"),
]
operations = [
migrations.AddField(
model_name="action",
name="group",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.SET_NULL, to="core.group"
),
),
]

View file

@ -0,0 +1,47 @@
# Generated by Django 3.2.13 on 2023-01-13 14:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0041_action_group"),
]
operations = [
migrations.AddField(
model_name="createsnapshotjob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
migrations.AddField(
model_name="duplicateapplicationjob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
migrations.AddField(
model_name="installtemplatejob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
migrations.AddField(
model_name="restoresnapshotjob",
name="user_ip_address",
field=models.GenericIPAddressField(
help_text="The user IP address.", null=True
),
),
migrations.AddIndex(
model_name="job",
index=models.Index(
fields=["-updated_on"], name="core_job_updated_e7a478_idx"
),
),
]

View file

@ -9,7 +9,11 @@ from django.db.models import Q, UniqueConstraint
from rest_framework.exceptions import NotAuthenticated
from baserow.core.jobs.mixins import JobWithUndoRedoIds, JobWithWebsocketId
from baserow.core.jobs.mixins import (
JobWithUndoRedoIds,
JobWithUserIpAddress,
JobWithWebsocketId,
)
from baserow.core.jobs.models import Job
from baserow.core.user_files.models import UserFile
@ -464,7 +468,9 @@ class TrashEntry(models.Model):
]
class DuplicateApplicationJob(JobWithWebsocketId, JobWithUndoRedoIds, Job):
class DuplicateApplicationJob(
JobWithUserIpAddress, JobWithWebsocketId, JobWithUndoRedoIds, Job
):
original_application = models.ForeignKey(
Application,
@ -501,7 +507,9 @@ class Snapshot(HierarchicalModelMixin, models.Model):
return self.snapshot_from_application
class InstallTemplateJob(JobWithWebsocketId, JobWithUndoRedoIds, Job):
class InstallTemplateJob(
JobWithUserIpAddress, JobWithWebsocketId, JobWithUndoRedoIds, Job
):
group = models.ForeignKey(
Group,
on_delete=models.CASCADE,

View file

@ -73,6 +73,12 @@ class CustomFieldsInstanceMixin:
`serializer_field_overrides` property.
"""
serializer_mixins = []
"""
The serializer mixins that must be added to the serializer. This property is
useful if you want to add some custom SerializerMethodField for example.
"""
def __init__(self):
"""
:raises ValueError: If the object does not have a `model_class` attribute.
@ -105,10 +111,13 @@ class CustomFieldsInstanceMixin:
else:
field_names = self.serializer_field_names
mixins = [] if request_serializer else self.serializer_mixins
return get_serializer_class(
self.model_class,
field_names,
field_overrides=field_overrides,
base_mixins=mixins,
*args,
**kwargs,
)

View file

@ -0,0 +1,176 @@
import dataclasses
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.core.action.registries import (
ActionScopeStr,
ActionType,
ActionTypeDescription,
)
from baserow.core.action.scopes import GroupActionScopeType
from baserow.core.models import Snapshot
from baserow.core.snapshots.exceptions import SnapshotDoesNotExist
from baserow.core.snapshots.handler import SnapshotHandler
from baserow.core.utils import Progress
class CreateSnapshotActionType(ActionType):
type = "create_snapshot"
description = ActionTypeDescription(
_("Create Snapshot"),
_(
'Snapshot "%(snapshot_name)s" (%(snapshot_id)s) created for '
'application "%(application_name)s" (%(application_id)s).'
),
)
@dataclasses.dataclass
class Params:
application_id: int
application_name: str
snapshot_id: int
snapshot_name: str
@classmethod
def do(cls, user: AbstractUser, snapshot: Snapshot, progress: Progress):
"""
Creates a snapshot for the given application.
:param application_id: The id of the application for which a snapshot will be
created.
:param user: The user performing the delete.
:param name: The name that will be given to the snapshot.
"""
snapshot_created = SnapshotHandler().perform_create(snapshot, progress)
application = snapshot.snapshot_from_application
group = application.group
cls.register_action(
user=user,
params=cls.Params(
application.id, application.name, snapshot.id, snapshot.name
),
scope=cls.scope(group.id),
group=group,
)
return snapshot_created
@classmethod
def scope(cls, group_id: int) -> ActionScopeStr:
return GroupActionScopeType.value(group_id)
class RestoreSnapshotActionType(ActionType):
type = "restore_snapshot"
description = ActionTypeDescription(
_("Restore Snapshot"),
_(
'Snapshot "%(snapshot_name)s" (%(snapshot_id)s) restored from application '
'"%(original_application_name)s" (%(original_application_id)s) '
'to application "%(application_name)s" (%(application_id)s).'
),
)
@dataclasses.dataclass
class Params:
application_id: int
application_name: str
snapshot_id: int
snapshot_name: str
original_application_id: int
original_application_name: str
@classmethod
def do(cls, user: AbstractUser, snapshot: Snapshot, progress: Progress):
"""
Creates a snapshot for the given application.
:param snapshot_id: The id of the snapshot that will be restored.
:param user: The user performing the delete.
:raises SnapshotDoesNotExist: When the snapshot with the provided id
does not exist.
"""
original_application = snapshot.snapshot_from_application
application = SnapshotHandler().perform_restore(snapshot, progress)
group = application.group
cls.register_action(
user=user,
params=cls.Params(
application.id,
application.name,
snapshot.id,
snapshot.name,
original_application.id,
original_application.name,
),
scope=cls.scope(group.id),
group=group,
)
return application
@classmethod
def scope(cls, group_id: int) -> ActionScopeStr:
return GroupActionScopeType.value(group_id)
class DeleteSnapshotActionType(ActionType):
type = "delete_snapshot"
description = ActionTypeDescription(
_("Delete Snapshot"),
_(
'Snapshot "%(snapshot_name)s" (%(snapshot_id)s) deleted for '
'application "%(application_name)s" (%(application_id)s).'
),
)
@dataclasses.dataclass
class Params:
application_id: int
application_name: str
snapshot_id: int
snapshot_name: str
@classmethod
def do(cls, user: AbstractUser, snapshot_id: int):
"""
Creates a snapshot for the given application.
:param user: The user performing the delete.
:param snapshot_id: The id of the snapshot that will be deleted.
:raises SnapshotDoesNotExist: When the snapshot with the provided id
does not exist.
"""
try:
snapshot = (
Snapshot.objects.filter(id=snapshot_id)
.select_for_update(of=("self",))
.select_related("snapshot_from_application__group")
.get()
)
except Snapshot.DoesNotExist:
raise SnapshotDoesNotExist()
application = snapshot.snapshot_from_application
group = application.group
snapshot_name = snapshot.name
SnapshotHandler().delete(snapshot.id, performed_by=user)
cls.register_action(
user=user,
params=cls.Params(
application.id, application.name, snapshot_id, snapshot_name
),
scope=cls.scope(group.id),
group=group,
)
@classmethod
def scope(cls, group_id: int) -> ActionScopeStr:
return GroupActionScopeType.value(group_id)

View file

@ -26,7 +26,7 @@ from baserow.core.snapshots.exceptions import (
)
from baserow.core.utils import Progress
from .job_type import CreateSnapshotJobType, RestoreSnapshotJobType
from .job_types import CreateSnapshotJobType, RestoreSnapshotJobType
from .operations import (
CreateSnapshotApplicationOperationType,
DeleteApplicationSnapshotOperationType,
@ -422,7 +422,7 @@ class SnapshotHandler:
application, None, default_storage
)
progress.increment(by=50)
imported_database = application_type.import_serialized(
imported_application = application_type.import_serialized(
snapshot.snapshot_from_application.group,
exported_application,
{},
@ -430,9 +430,9 @@ class SnapshotHandler:
default_storage,
progress_builder=progress.create_child_builder(represents_progress=50),
)
imported_database.name = CoreHandler().find_unused_application_name(
imported_application.name = CoreHandler().find_unused_application_name(
snapshot.snapshot_from_application.group, snapshot.name
)
imported_database.save()
application_created.send(self, application=imported_database, user=None)
return imported_database
imported_application.save()
application_created.send(self, application=imported_application, user=None)
return imported_application

View file

@ -1,5 +1,6 @@
from baserow.api.errors import ERROR_USER_NOT_IN_GROUP
from baserow.api.snapshots.errors import ERROR_SNAPSHOT_DOES_NOT_EXIST
from baserow.core.action.registries import action_type_registry
from baserow.core.exceptions import UserNotInGroup
from baserow.core.handler import CoreHandler
from baserow.core.jobs.registries import JobType
@ -29,9 +30,11 @@ class CreateSnapshotJobType(JobType):
return application_type.export_safe_transaction_context(application)
def run(self, job: CreateSnapshotJob, progress):
from baserow.core.snapshots.handler import SnapshotHandler
from .actions import CreateSnapshotActionType
SnapshotHandler().perform_create(job.snapshot, progress)
action_type_registry.get(CreateSnapshotActionType.type).do(
job.user, job.snapshot, progress
)
class RestoreSnapshotJobType(JobType):
@ -45,6 +48,8 @@ class RestoreSnapshotJobType(JobType):
}
def run(self, job: RestoreSnapshotJob, progress):
from baserow.core.snapshots.handler import SnapshotHandler
from .actions import RestoreSnapshotActionType
SnapshotHandler().perform_restore(job.snapshot, progress)
action_type_registry.get(RestoreSnapshotActionType.type).do(
job.user, job.snapshot, progress
)

View file

@ -1,16 +1,17 @@
from django.db import models
from baserow.core.jobs.mixins import JobWithUserIpAddress
from baserow.core.jobs.models import Job
from baserow.core.models import Snapshot
class CreateSnapshotJob(Job):
class CreateSnapshotJob(JobWithUserIpAddress, Job):
snapshot: Snapshot = models.ForeignKey(
Snapshot, null=True, on_delete=models.SET_NULL
)
class RestoreSnapshotJob(Job):
class RestoreSnapshotJob(JobWithUserIpAddress, Job):
snapshot: Snapshot = models.ForeignKey(
Snapshot, null=True, on_delete=models.SET_NULL
)

View file

@ -0,0 +1,197 @@
import dataclasses
from typing import Any, Optional
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from baserow.core.action.registries import (
ActionScopeStr,
ActionType,
ActionTypeDescription,
)
from baserow.core.action.scopes import RootActionScopeType
from baserow.core.models import Template
from baserow.core.user.handler import UserHandler
class CreateUserActionType(ActionType):
type = "create_user"
description = ActionTypeDescription(
_("Create User"),
_(
'User "%(user_email)s" (%(user_id)s) created '
"(via invitation: %(with_invitation_token)s, "
"from template: %(template_id)s)"
),
)
@dataclasses.dataclass
class Params:
user_id: int
user_email: str
group_id: Optional[int] = None
group_name: Optional[str] = ""
with_invitation_token: bool = False
template_id: Optional[int] = None
@classmethod
def do(
cls,
name: str,
email: str,
password: str,
language: str,
group_invitation_token: Optional[str] = None,
template: Optional[Template] = None,
) -> AbstractUser:
"""
Creates a new user.
:param name: The name of the user.
:param email: The email address of the user.
:param password: The password of the user.
:param language: The language of the user.
:param group_invitation_token: The group invitation token that will be used to
add the user to a group.
:param template: The template that will be used to create the user.
:return: The created user.
"""
user = UserHandler().create_user(
name, email, password, language, group_invitation_token, template
)
group_id, group_name = None, None
if user.default_group:
group_id = user.default_group.id
group_name = user.default_group.name
cls.register_action(
user=user,
params=cls.Params(
user.id,
user.email,
group_id,
group_name,
group_invitation_token is not None,
template.id if template else None,
),
scope=cls.scope(),
group=user.default_group,
)
return user
@classmethod
def scope(cls) -> ActionScopeStr:
return RootActionScopeType.value()
class UpdateUserActionType(ActionType):
type = "update_user"
description = ActionTypeDescription(
_("Update User"),
_('User "%(user_email)s" (%(user_id)s) updated'),
)
@dataclasses.dataclass
class Params:
user_id: int
user_email: str
first_name: Optional[str]
language: Optional[str]
@classmethod
def do(
cls,
user: AbstractUser,
first_name: Optional[str] = None,
language: Optional[str] = None,
**kwargs: Any
) -> AbstractUser:
"""
Updates user's data.
:param user: The user that will be updated.
:param data: The data that will be used to update the user.
:return: The updated user.
"""
user = UserHandler().update_user(user, first_name=first_name, language=language)
cls.register_action(
user=user,
params=cls.Params(user.id, user.email, first_name, language),
scope=cls.scope(),
)
return user
@classmethod
def scope(cls) -> ActionScopeStr:
return RootActionScopeType.value()
class ScheduleUserDeletionActionType(ActionType):
type = "schedule_user_deletion"
description = ActionTypeDescription(
_("Schedule user deletion"),
_(
'User "%(user_email)s" (%(user_id)s) scheduled to be deleted after grace time'
),
)
@dataclasses.dataclass
class Params:
user_id: int
user_email: str
@classmethod
def do(cls, user: AbstractUser) -> AbstractUser:
"""
Schedules the user for deletion.
:param user: The user that will be updated.
"""
UserHandler().schedule_user_deletion(user)
cls.register_action(
user=user, params=cls.Params(user.id, user.email), scope=cls.scope()
)
@classmethod
def scope(cls) -> ActionScopeStr:
return RootActionScopeType.value()
class CancelUserDeletionActionType(ActionType):
type = "cancel_user_deletion"
description = ActionTypeDescription(
_("Cancel user deletion"),
_(
'User "%(user_email)s" (%(user_id)s) logged in cancelling the deletion process'
),
)
@dataclasses.dataclass
class Params:
user_id: int
user_email: str
@classmethod
def do(cls, user: AbstractUser) -> AbstractUser:
"""
Stops the deletion process for the user.
:param user: The user that will be updated.
"""
user = UserHandler().cancel_user_deletion(user)
cls.register_action(
user=user, params=cls.Params(user.id, user.email), scope=cls.scope()
)
return user
@classmethod
def scope(cls) -> ActionScopeStr:
return RootActionScopeType.value()

View file

@ -207,6 +207,7 @@ class UserHandler:
# If we've created a `GroupUser` at some point, pluck out the `Group`.
group = getattr(group_user, "group", None)
user.default_group = group
if not group_invitation_token and template and group:
core_handler.install_template(user, group, template)

Binary file not shown.

View file

@ -0,0 +1,28 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-16 14:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
#: src/baserow/api/authentication.py:24
msgid "Token contained no recognizable user identification"
msgstr ""
#: src/baserow/api/authentication.py:30
msgid "User not found"
msgstr ""

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more