Merge branch 'sentry-feedback-fixes' into 'main'
Various issues reported by sentry See merge request framasoft/mobilizon!1195
This commit is contained in:
commit
b8d40a90ab
@ -274,7 +274,7 @@ package-app-dev:
|
||||
# Packaging app for multi-arch
|
||||
multi-arch-release:
|
||||
stage: package
|
||||
image: docker:stable
|
||||
image: docker:20.10.12
|
||||
variables:
|
||||
DOCKER_TLS_CERTDIR: "/certs"
|
||||
DOCKER_HOST: tcp://docker:2376
|
||||
@ -283,7 +283,7 @@ multi-arch-release:
|
||||
DOCKER_DRIVER: overlay2
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
services:
|
||||
- docker:stable-dind
|
||||
- docker:20.10.12-dind
|
||||
cache: {}
|
||||
before_script:
|
||||
# Install buildx
|
||||
|
@ -8,5 +8,5 @@
|
||||
out: "",
|
||||
threshold: "medium",
|
||||
ignore: ["Config.HTTPS", "Config.CSP"],
|
||||
ignore_files: ["config/dev.1.secret.exs", "config/dev.2.secret.exs", "config/dev.3.secret.exs", "config/dev.secret.exs", "config/e2e.secret.exs", "config/prod.secret.exs", "config/test.secret.exs", "config/runtime.1.secret.exs", "config/runtime.2.secret.exs", "config/runtime.3.secret.exs", "config/runtime.exs"]
|
||||
ignore_files: ["config/runtime.exs"]
|
||||
]
|
||||
|
@ -1,12 +1,16 @@
|
||||
|
||||
5048AE33D6269B15E21CF28C6F545AB6
|
||||
|
||||
752C0E897CA81ACD81F4BB215FA5F8E4
|
||||
23412CF16549E4E88366DC9DECF39071
|
||||
81C1F600C5809C7029EE32DE4818CD7D
|
||||
02CE4963DFD1B0D6D5C567357CAFFE97
|
||||
155A1FB53DE39EC8EFCFD7FB94EA823D
|
||||
73B351E4CB3AF715AD450A085F5E6304
|
||||
BBACD7F0BACD4A6D3010C26604671692
|
||||
6D4D4A4821B93BCFAC9CDBB367B34C4B
|
||||
5674F0D127852889ED0132DC2F442AAB
|
||||
1600B7206E47F630D94AB54C360906F0
|
||||
2262742E5C8944D5BF6698EC61F5DE50
|
||||
25BEE162A99754480967216281E9EF33
|
||||
2A6F71CD6F1246F0B152C2376E2E398A
|
||||
30552A09D485A6AA73401C1D54F63C21
|
||||
52900CE4EE3598F6F178A651FB256770
|
||||
6151F44368FC19F2394274F513C29151
|
||||
765526195D4C6D770EAF4DC944A8CBF4
|
||||
B2FF1A12F13B873507C85091688C1D6D
|
||||
B9AF8A342CD7FF39E10CC10A408C28E1
|
||||
C042E87389F7BDCFF4E076E95731AE69
|
||||
C42BFAEF7100F57BED75998B217C857A
|
||||
D11958E86F1B6D37EF656B63405CA8A4
|
||||
F16F054F2628609A726B9FF2F089D484
|
@ -221,7 +221,7 @@ export default class App extends Vue {
|
||||
? this.routerView?.$refs?.componentFocusTarget
|
||||
: this.routerView?.$el
|
||||
) as HTMLElement;
|
||||
if (focusTarget) {
|
||||
if (focusTarget && focusTarget instanceof Element) {
|
||||
// Make focustarget programmatically focussable
|
||||
focusTarget.setAttribute("tabindex", "-1");
|
||||
|
||||
|
@ -45,7 +45,7 @@
|
||||
</a>
|
||||
<resource-dropdown
|
||||
class="actions"
|
||||
v-if="!inline || !preview"
|
||||
v-if="!inline && !preview"
|
||||
@delete="$emit('delete', resource.id)"
|
||||
@move="$emit('move', resource)"
|
||||
@rename="$emit('rename', resource)"
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div v-if="resource">
|
||||
<article class="panel is-primary">
|
||||
<p class="panel-heading">
|
||||
<p class="panel-heading truncate">
|
||||
{{
|
||||
$t('Move "{resourceName}"', { resourceName: initialResource.title })
|
||||
}}
|
||||
@ -28,7 +28,7 @@
|
||||
</a>
|
||||
<template v-if="resource.children">
|
||||
<a
|
||||
class="panel-block"
|
||||
class="panel-block flex-wrap"
|
||||
v-for="element in resource.children.elements"
|
||||
:class="{
|
||||
clickable:
|
||||
@ -37,15 +37,17 @@
|
||||
:key="element.id"
|
||||
@click="goDown(element)"
|
||||
>
|
||||
<span class="panel-icon">
|
||||
<b-icon
|
||||
icon="folder"
|
||||
size="is-small"
|
||||
v-if="element.type === 'folder'"
|
||||
/>
|
||||
<b-icon icon="link" size="is-small" v-else />
|
||||
</span>
|
||||
{{ element.title }}
|
||||
<p class="truncate">
|
||||
<span class="panel-icon">
|
||||
<b-icon
|
||||
icon="folder"
|
||||
size="is-small"
|
||||
v-if="element.type === 'folder'"
|
||||
/>
|
||||
<b-icon icon="link" size="is-small" v-else />
|
||||
</span>
|
||||
<span>{{ element.title }}</span>
|
||||
</p>
|
||||
<span v-if="element.id === initialResource.id">
|
||||
<em v-if="element.type === 'folder'"> {{ $t("(this folder)") }}</em>
|
||||
<em v-else> {{ $t("(this link)") }}</em>
|
||||
@ -89,7 +91,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { Component, Vue, Prop } from "vue-property-decorator";
|
||||
import { Component, Vue, Prop, Watch } from "vue-property-decorator";
|
||||
import { GET_RESOURCE } from "../../graphql/resources";
|
||||
import { IResource } from "../../types/resource";
|
||||
|
||||
@ -119,7 +121,7 @@ export default class ResourceSelector extends Vue {
|
||||
|
||||
@Prop({ required: true }) username!: string;
|
||||
|
||||
resource: IResource | undefined = this.initialResource.parent;
|
||||
resource: IResource | undefined = undefined;
|
||||
|
||||
RESOURCES_PER_PAGE = 10;
|
||||
|
||||
@ -131,6 +133,20 @@ export default class ResourceSelector extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
data() {
|
||||
return {
|
||||
resource: this.initialResource?.parent,
|
||||
};
|
||||
}
|
||||
|
||||
@Watch("initialResource")
|
||||
updateResourceFromProp() {
|
||||
if (this.initialResource) {
|
||||
this.resource = this.initialResource?.parent;
|
||||
this.$apollo.queries.resource.refetch();
|
||||
}
|
||||
}
|
||||
|
||||
updateResource(): void {
|
||||
this.$emit(
|
||||
"update-resource",
|
||||
|
@ -1308,5 +1308,6 @@
|
||||
"© The OpenStreetMap Contributors": "© Les Contributeur⋅ices OpenStreetMap",
|
||||
"Category": "Catégorie",
|
||||
"Select a category": "Choisissez une categorie",
|
||||
"Any category": "N'importe quelle catégorie"
|
||||
"Any category": "N'importe quelle catégorie",
|
||||
"No instance found.": "Aucune instance trouvée."
|
||||
}
|
||||
|
@ -9,10 +9,7 @@
|
||||
<b-icon icon="folder" />
|
||||
{{ $t("New folder") }}
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
aria-role="listitem"
|
||||
@click="createLinkResourceModal = true"
|
||||
>
|
||||
<b-dropdown-item aria-role="listitem" @click="createLinkModal">
|
||||
<b-icon icon="link" />
|
||||
{{ $t("New link") }}
|
||||
</b-dropdown-item>
|
||||
@ -124,7 +121,11 @@
|
||||
<section class="modal-card-body">
|
||||
<form @submit.prevent="renameResource">
|
||||
<b-field :label="$t('Title')">
|
||||
<b-input aria-required="true" v-model="updatedResource.title" />
|
||||
<b-input
|
||||
ref="resourceRenameInput"
|
||||
aria-required="true"
|
||||
v-model="updatedResource.title"
|
||||
/>
|
||||
</b-field>
|
||||
|
||||
<b-button native-type="submit">{{
|
||||
@ -154,12 +155,17 @@
|
||||
:active.sync="createResourceModal"
|
||||
has-modal-card
|
||||
:close-button-aria-label="$t('Close')"
|
||||
trap-focus
|
||||
>
|
||||
<div class="modal-card">
|
||||
<section class="modal-card-body">
|
||||
<b-message type="is-danger" v-if="modalError">
|
||||
{{ modalError }}
|
||||
</b-message>
|
||||
<form @submit.prevent="createResource">
|
||||
<b-field :label="$t('Title')" label-for="new-resource-title">
|
||||
<b-input
|
||||
ref="modalNewResourceInput"
|
||||
aria-required="true"
|
||||
v-model="newResource.title"
|
||||
id="new-resource-title"
|
||||
@ -179,6 +185,7 @@
|
||||
class="link-resource-modal"
|
||||
aria-modal
|
||||
:close-button-aria-label="$t('Close')"
|
||||
trap-focus
|
||||
>
|
||||
<div class="modal-card">
|
||||
<section class="modal-card-body">
|
||||
@ -193,6 +200,7 @@
|
||||
required
|
||||
v-model="newResource.resourceUrl"
|
||||
@blur="previewResource"
|
||||
ref="modalNewResourceLinkInput"
|
||||
/>
|
||||
</b-field>
|
||||
|
||||
@ -355,6 +363,12 @@ export default class Resources extends Mixins(ResourceMixin) {
|
||||
put: true,
|
||||
};
|
||||
|
||||
$refs!: {
|
||||
resourceRenameInput: any;
|
||||
modalNewResourceInput: HTMLElement;
|
||||
modalNewResourceLinkInput: HTMLElement;
|
||||
};
|
||||
|
||||
mapServiceTypeToIcon = mapServiceTypeToIcon;
|
||||
|
||||
get page(): number {
|
||||
@ -458,15 +472,25 @@ export default class Resources extends Mixins(ResourceMixin) {
|
||||
}
|
||||
}
|
||||
|
||||
createFolderModal(): void {
|
||||
this.newResource.type = "folder";
|
||||
this.createResourceModal = true;
|
||||
async createLinkModal(): Promise<void> {
|
||||
this.createLinkResourceModal = true;
|
||||
await this.$nextTick();
|
||||
this.$refs.modalNewResourceLinkInput.focus();
|
||||
}
|
||||
|
||||
createResourceFromProvider(provider: IProvider): void {
|
||||
async createFolderModal(): Promise<void> {
|
||||
this.newResource.type = "folder";
|
||||
this.createResourceModal = true;
|
||||
await this.$nextTick();
|
||||
this.$refs.modalNewResourceInput.focus();
|
||||
}
|
||||
|
||||
async createResourceFromProvider(provider: IProvider): Promise<void> {
|
||||
this.newResource.resourceUrl = Resources.generateFullResourceUrl(provider);
|
||||
this.newResource.type = provider.software;
|
||||
this.createResourceModal = true;
|
||||
await this.$nextTick();
|
||||
this.$refs.modalNewResourceInput.focus();
|
||||
}
|
||||
|
||||
static generateFullResourceUrl(provider: IProvider): string {
|
||||
@ -549,10 +573,12 @@ export default class Resources extends Mixins(ResourceMixin) {
|
||||
}
|
||||
}
|
||||
|
||||
handleRename(resource: IResource): void {
|
||||
console.log("handleRename");
|
||||
async handleRename(resource: IResource): Promise<void> {
|
||||
this.renameModal = true;
|
||||
this.updatedResource = { ...resource };
|
||||
await this.$nextTick();
|
||||
this.$refs.resourceRenameInput.focus();
|
||||
this.$refs.resourceRenameInput.$el.querySelector("input").select();
|
||||
}
|
||||
|
||||
handleMove(resource: IResource): void {
|
||||
|
@ -148,7 +148,7 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do
|
||||
{:error, :http_error}
|
||||
|
||||
{:error, error} ->
|
||||
Logger.warn("Could not fetch actor at fetch #{url}, #{inspect(error)}")
|
||||
Logger.info("Could not fetch actor at #{url}, #{inspect(error)}")
|
||||
{:error, :http_error}
|
||||
end
|
||||
end
|
||||
|
@ -91,6 +91,9 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
# Object already exists
|
||||
{:ok, nil, comment}
|
||||
end
|
||||
|
||||
{:error, err} ->
|
||||
{:error, err}
|
||||
end
|
||||
end
|
||||
|
||||
@ -850,8 +853,8 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
# Handle incoming `Accept` activities wrapping a `Join` activity on an event
|
||||
defp do_handle_incoming_accept_join(join_object, %Actor{} = actor_accepting) do
|
||||
case get_participant(join_object, actor_accepting) do
|
||||
{:ok, participant} ->
|
||||
do_handle_incoming_accept_join_event(participant, actor_accepting)
|
||||
{:ok, activity, participant} ->
|
||||
do_handle_incoming_accept_join_event(participant, actor_accepting, activity)
|
||||
|
||||
{:error, _err} ->
|
||||
case get_member(join_object) do
|
||||
@ -870,17 +873,22 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
end
|
||||
end
|
||||
|
||||
defp do_handle_incoming_accept_join_event(%Participant{role: :participant}, _actor) do
|
||||
defp do_handle_incoming_accept_join_event(
|
||||
%Participant{role: :participant} = participant,
|
||||
_actor,
|
||||
activity
|
||||
) do
|
||||
Logger.debug(
|
||||
"Tried to handle an Accept activity on a Join activity with a event object but the participant is already validated"
|
||||
)
|
||||
|
||||
nil
|
||||
{:ok, activity, participant}
|
||||
end
|
||||
|
||||
defp do_handle_incoming_accept_join_event(
|
||||
%Participant{role: role, event: event} = participant,
|
||||
%Actor{} = actor_accepting
|
||||
%Actor{} = actor_accepting,
|
||||
_activity
|
||||
)
|
||||
when role in [:not_approved, :rejected] do
|
||||
with %Event{} = event <- Events.get_event_with_preload!(event.id),
|
||||
@ -932,7 +940,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
|
||||
# Handle incoming `Reject` activities wrapping a `Join` activity on an event
|
||||
defp do_handle_incoming_reject_join(join_object, %Actor{} = actor_accepting) do
|
||||
with {:join_event, {:ok, %Participant{event: event, role: role} = participant}}
|
||||
with {:join_event, {:ok, _activity, %Participant{event: event, role: role} = participant}}
|
||||
when role != :rejected <-
|
||||
{:join_event, get_participant(join_object, actor_accepting)},
|
||||
{:event, %Event{} = event} <- {:event, Events.get_event_with_preload!(event.id)},
|
||||
@ -943,7 +951,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
:ok <- Participation.send_emails_to_local_user(participant) do
|
||||
{:ok, activity, participant}
|
||||
else
|
||||
{:join_event, {:ok, %Participant{role: :rejected}}} ->
|
||||
{:join_event, {:ok, _activity, %Participant{role: :rejected}}} ->
|
||||
Logger.warn(
|
||||
"Tried to handle an Reject activity on a Join activity with a event object but the participant is already rejected"
|
||||
)
|
||||
@ -1040,18 +1048,18 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
end
|
||||
end
|
||||
|
||||
defp get_participant(join_object, %Actor{} = actor_accepting, loop \\ 1) do
|
||||
defp get_participant(join_object, %Actor{} = actor_accepting, loop \\ 1, activity \\ nil) do
|
||||
with join_object_id when not is_nil(join_object_id) <- Utils.get_url(join_object),
|
||||
{:not_found, %Participant{} = participant} <-
|
||||
{:not_found, Events.get_participant_by_url(join_object_id)} do
|
||||
{:ok, participant}
|
||||
{:ok, activity, participant}
|
||||
else
|
||||
{:not_found, _err} ->
|
||||
with true <- is_map(join_object),
|
||||
true <- loop < 2,
|
||||
true <- Utils.are_same_origin?(actor_accepting.url, join_object["id"]),
|
||||
{:ok, _activity, %Participant{url: participant_url}} <- handle_incoming(join_object) do
|
||||
get_participant(participant_url, actor_accepting, 2)
|
||||
{:ok, activity, %Participant{url: participant_url}} <- handle_incoming(join_object) do
|
||||
get_participant(participant_url, actor_accepting, 2, activity)
|
||||
else
|
||||
_ ->
|
||||
{:error, "Participant URL not found"}
|
||||
|
@ -337,8 +337,9 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do
|
||||
message: "Object contains an actor object with invalid type: #{inspect(type)}"
|
||||
end
|
||||
|
||||
def get_actor(%{"actor" => nil, "attributedTo" => nil}) do
|
||||
raise ArgumentError, message: "Object contains both actor and attributedTo fields being null"
|
||||
def get_actor(%{"actor" => nil, "attributedTo" => nil} = object) do
|
||||
raise ArgumentError,
|
||||
message: "Object contains both actor and attributedTo fields being null: #{inspect(object)}"
|
||||
end
|
||||
|
||||
def get_actor(%{"actor" => _}) do
|
||||
|
@ -102,14 +102,18 @@ defmodule Mobilizon.Federation.HTTPSignatures.Signature do
|
||||
end
|
||||
|
||||
@spec sign(Actor.t(), map()) :: String.t() | {:error, :pem_decode_error} | no_return
|
||||
def sign(%Actor{domain: domain, keys: keys} = actor, headers) when is_nil(domain) do
|
||||
Logger.debug("Signing a payload on behalf of #{actor.url}")
|
||||
def sign(%Actor{domain: domain, keys: keys, url: url} = actor, headers) when is_nil(domain) do
|
||||
Logger.debug("Signing a payload on behalf of #{url}")
|
||||
Logger.debug("headers")
|
||||
Logger.debug(inspect(headers))
|
||||
|
||||
case prepare_public_key(keys) do
|
||||
{:ok, key} ->
|
||||
HTTPSignatures.sign(key, actor.url <> "#main-key", headers)
|
||||
if Application.get_env(:sentry, :dsn) != nil do
|
||||
Sentry.Context.set_extra_context(%{"actor_url" => url})
|
||||
end
|
||||
|
||||
HTTPSignatures.sign(key, url <> "#main-key", headers)
|
||||
|
||||
{:error, :pem_decode_error} ->
|
||||
raise ArgumentError, message: "Failed to prepare public keys for #{actor.url}"
|
||||
|
@ -122,6 +122,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:ok, _, %Resource{} = resource} ->
|
||||
{:ok, resource}
|
||||
|
||||
{:error, %Ecto.Changeset{} = changeset} ->
|
||||
{:error, changeset}
|
||||
|
||||
{:error, _err} ->
|
||||
{:error, dgettext("errors", "Error while creating resource")}
|
||||
end
|
||||
|
@ -63,6 +63,10 @@ defmodule Mobilizon.Resources.Resource do
|
||||
|> maybe_add_published_at()
|
||||
|> validate_resource_or_folder()
|
||||
|> validate_required(@required_attrs)
|
||||
|> validate_length(:title, max: 200)
|
||||
|> validate_length(:summary, max: 400)
|
||||
|> validate_length(:resource_url, max: 400)
|
||||
|> validate_length(:path, max: 500)
|
||||
|> unique_constraint(:url, name: :resource_url_index)
|
||||
end
|
||||
|
||||
|
@ -119,7 +119,11 @@ defmodule Mobilizon.Resources do
|
||||
{:ok, resource}
|
||||
|
||||
{:error, operation, reason, _changes} ->
|
||||
{:error, "Error while inserting resource when #{operation} because of #{inspect(reason)}"}
|
||||
Logger.error(
|
||||
"Error while inserting resource when #{operation} because of #{inspect(reason)}"
|
||||
)
|
||||
|
||||
{:error, reason}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -182,7 +182,7 @@ defmodule Mobilizon.Service.DateTime do
|
||||
compare_to_day = Keyword.get(options, :compare_to_day, Date.utc_today())
|
||||
compare_to = Keyword.get(options, :compare_to_datetime, DateTime.utc_now())
|
||||
start_time = Keyword.get(options, :start_time, @start_time)
|
||||
timezone = Keyword.get(options, :timezone, "Etc/UTC")
|
||||
timezone = Keyword.get(options, :timezone, "Etc/UTC") || "Etc/UTC"
|
||||
end_time = Keyword.get(options, :end_time, @end_time)
|
||||
|
||||
DateTime.compare(compare_to, DateTime.new!(compare_to_day, start_time, timezone)) in [
|
||||
|
@ -46,7 +46,7 @@ defmodule Mobilizon.Service.Workers.Notification do
|
||||
}) do
|
||||
with %User{locale: locale, settings: %Setting{timezone: timezone, notification_on_day: true}} =
|
||||
user <- Users.get_user_with_settings!(user_id),
|
||||
{start, tomorrow} <- calculate_start_end(1, timezone),
|
||||
{start, tomorrow} <- calculate_start_end(1, timezone || "Etc/UTC"),
|
||||
%Page{
|
||||
elements: participations,
|
||||
total: total
|
||||
@ -80,7 +80,7 @@ defmodule Mobilizon.Service.Workers.Notification do
|
||||
locale: locale,
|
||||
settings: %Setting{timezone: timezone, notification_each_week: true}
|
||||
} = user <- Users.get_user_with_settings!(user_id),
|
||||
{start, end_week} <- calculate_start_end(7, timezone),
|
||||
{start, end_week} <- calculate_start_end(7, timezone || "Etc/UTC"),
|
||||
%Page{
|
||||
elements: participations,
|
||||
total: total
|
||||
|
@ -26,22 +26,6 @@ defmodule Mobilizon.Web.Auth.Context do
|
||||
|
||||
user_agent = conn |> Plug.Conn.get_req_header("user-agent") |> List.first()
|
||||
|
||||
if Application.get_env(:sentry, :dsn) != nil do
|
||||
Sentry.Context.set_request_context(%{
|
||||
url: Plug.Conn.request_url(conn),
|
||||
method: conn.method,
|
||||
headers: %{
|
||||
"User-Agent": user_agent,
|
||||
Referer: conn |> Plug.Conn.get_req_header("referer") |> List.first()
|
||||
},
|
||||
query_string: conn.query_string,
|
||||
env: %{
|
||||
REQUEST_ID: conn |> Plug.Conn.get_resp_header("x-request-id") |> List.first(),
|
||||
SERVER_NAME: conn.host
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
{conn, context} =
|
||||
case Guardian.Plug.current_resource(conn) do
|
||||
%User{id: user_id, email: user_email} = user ->
|
||||
|
@ -131,7 +131,7 @@ defmodule Mobilizon.Web.ReverseProxy do
|
||||
Logger.warn("Tried to reverse proxy URL #{inspect(url)}")
|
||||
|
||||
conn
|
||||
|> error_or_redirect(url, 500, "Request failed", opts)
|
||||
|> error_or_redirect(url, 400, "Request failed", opts)
|
||||
|> halt()
|
||||
|
||||
{:error, {:invalid_http_response, code}} ->
|
||||
@ -150,7 +150,7 @@ defmodule Mobilizon.Web.ReverseProxy do
|
||||
Logger.error("#{__MODULE__}: request to #{inspect(url)} failed: #{inspect(error)}")
|
||||
|
||||
conn
|
||||
|> error_or_redirect(url, 500, "Request failed", opts)
|
||||
|> error_or_redirect(url, 400, "Request failed", opts)
|
||||
|> halt()
|
||||
end
|
||||
end
|
||||
|
26
lib/web/request_context.ex
Normal file
26
lib/web/request_context.ex
Normal file
@ -0,0 +1,26 @@
|
||||
defmodule Mobilizon.Web.RequestContext do
|
||||
@moduledoc """
|
||||
Module to put some context into the request
|
||||
"""
|
||||
|
||||
@spec put_request_context(Plug.Conn.t(), Keyword.t()) :: Plug.Conn.t()
|
||||
def put_request_context(%Plug.Conn{} = conn, _opts \\ []) do
|
||||
if Application.get_env(:sentry, :dsn) != nil do
|
||||
Sentry.Context.set_request_context(%{
|
||||
url: Plug.Conn.request_url(conn),
|
||||
method: conn.method,
|
||||
headers: %{
|
||||
"User-Agent": conn |> Plug.Conn.get_req_header("user-agent") |> List.first(),
|
||||
Referer: conn |> Plug.Conn.get_req_header("referer") |> List.first()
|
||||
},
|
||||
query_string: conn.query_string,
|
||||
env: %{
|
||||
REQUEST_ID: conn |> Plug.Conn.get_resp_header("x-request-id") |> List.first(),
|
||||
SERVER_NAME: conn.host
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
conn
|
||||
end
|
||||
end
|
@ -3,9 +3,11 @@ defmodule Mobilizon.Web.Router do
|
||||
Router for mobilizon app
|
||||
"""
|
||||
use Mobilizon.Web, :router
|
||||
import Mobilizon.Web.RequestContext
|
||||
|
||||
pipeline :graphql do
|
||||
# plug(:accepts, ["json"])
|
||||
plug(:put_request_context)
|
||||
plug(Mobilizon.Web.Auth.Pipeline)
|
||||
plug(Mobilizon.Web.Plugs.SetLocalePlug)
|
||||
end
|
||||
@ -22,29 +24,35 @@ defmodule Mobilizon.Web.Router do
|
||||
end
|
||||
|
||||
pipeline :host_meta do
|
||||
plug(:put_request_context)
|
||||
plug(:accepts, ["xrd-xml"])
|
||||
end
|
||||
|
||||
pipeline :well_known do
|
||||
plug(:put_request_context)
|
||||
plug(:accepts, ["json", "jrd-json"])
|
||||
end
|
||||
|
||||
pipeline :activity_pub_signature do
|
||||
plug(:put_request_context)
|
||||
plug(Mobilizon.Web.Plugs.HTTPSignatures)
|
||||
plug(Mobilizon.Web.Plugs.MappedSignatureToIdentity)
|
||||
end
|
||||
|
||||
pipeline :relay do
|
||||
plug(:put_request_context)
|
||||
plug(Mobilizon.Web.Plugs.HTTPSignatures)
|
||||
plug(Mobilizon.Web.Plugs.MappedSignatureToIdentity)
|
||||
plug(:accepts, ["activity-json", "json"])
|
||||
end
|
||||
|
||||
pipeline :activity_pub do
|
||||
plug(:put_request_context)
|
||||
plug(:accepts, ["activity-json"])
|
||||
end
|
||||
|
||||
pipeline :activity_pub_and_html do
|
||||
plug(:put_request_context)
|
||||
plug(:accepts, ["html", "activity-json"])
|
||||
plug(:put_secure_browser_headers)
|
||||
|
||||
@ -57,14 +65,13 @@ defmodule Mobilizon.Web.Router do
|
||||
end
|
||||
|
||||
pipeline :atom_and_ical do
|
||||
plug(:put_request_context)
|
||||
plug(:put_secure_browser_headers)
|
||||
plug(:accepts, ["atom", "ics", "html", "xml"])
|
||||
end
|
||||
|
||||
pipeline :exports do
|
||||
end
|
||||
|
||||
pipeline :browser do
|
||||
plug(:put_request_context)
|
||||
plug(Plug.Static, at: "/", from: "priv/static")
|
||||
|
||||
plug(Mobilizon.Web.Plugs.SetLocalePlug)
|
||||
@ -78,9 +85,6 @@ defmodule Mobilizon.Web.Router do
|
||||
plug(:put_secure_browser_headers)
|
||||
end
|
||||
|
||||
pipeline :remote_media do
|
||||
end
|
||||
|
||||
scope "/exports", Mobilizon.Web do
|
||||
pipe_through(:browser)
|
||||
get("/:format/:file", ExportController, :export)
|
||||
|
@ -6,4 +6,4 @@
|
||||
|
||||
<%= if @event.description do %><%= gettext("Details:") %>
|
||||
<%= process_description(@event.description) %>
|
||||
<%= if String.length(@event.description) > 200 do %><%= gettext("Read more : %{url}", url: Routes.page_url(Mobilizon.Web.Endpoint, :event, @event.uuid)) |> raw %><% end %><% end %>
|
||||
<%= if String.length(@event.description) > 200 do %><%= gettext("Read more: %{url}", url: Routes.page_url(Mobilizon.Web.Endpoint, :event, @event.uuid)) %><% end %><% end %>
|
@ -1620,11 +1620,6 @@ msgstr "تم قبول المشاركة"
|
||||
msgid "Participate:"
|
||||
msgstr "تم قبول المشاركة"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more : %{url}"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/card/_title.text.eex:1
|
||||
msgid "Title: %{title}"
|
||||
@ -1877,151 +1872,156 @@ msgid "View the details"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:10
|
||||
#: lib/mobilizon/events/categories.ex:16
|
||||
msgid "Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:46
|
||||
#: lib/mobilizon/events/categories.ex:52
|
||||
msgid "Auto, boat and air"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:14
|
||||
#: lib/mobilizon/events/categories.ex:20
|
||||
msgid "Book clubs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:18
|
||||
#: lib/mobilizon/events/categories.ex:24
|
||||
msgid "Business"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:22
|
||||
#: lib/mobilizon/events/categories.ex:28
|
||||
msgid "Causes"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:26
|
||||
#: lib/mobilizon/events/categories.ex:32
|
||||
msgid "Comedy"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:50
|
||||
#: lib/mobilizon/events/categories.ex:56
|
||||
msgid "Community"
|
||||
msgstr "التعليقات"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:30
|
||||
#: lib/mobilizon/events/categories.ex:36
|
||||
msgid "Crafts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:54
|
||||
#: lib/mobilizon/events/categories.ex:60
|
||||
msgid "Family & Education"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:58
|
||||
#: lib/mobilizon/events/categories.ex:64
|
||||
msgid "Fashion & Beauty"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:62
|
||||
#: lib/mobilizon/events/categories.ex:68
|
||||
msgid "Film & Media"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:34
|
||||
#: lib/mobilizon/events/categories.ex:40
|
||||
msgid "Food & Drink"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:66
|
||||
#: lib/mobilizon/events/categories.ex:72
|
||||
msgid "Games"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:38
|
||||
#: lib/mobilizon/events/categories.ex:44
|
||||
msgid "Health"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:78
|
||||
#: lib/mobilizon/events/categories.ex:84
|
||||
msgid "LGBTQ"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:70
|
||||
#: lib/mobilizon/events/categories.ex:76
|
||||
msgid "Language & Culture"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:74
|
||||
#: lib/mobilizon/events/categories.ex:80
|
||||
msgid "Learning"
|
||||
msgstr "تنبيه"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:127
|
||||
#: lib/mobilizon/events/categories.ex:133
|
||||
msgid "Meeting"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:82
|
||||
#: lib/mobilizon/events/categories.ex:88
|
||||
msgid "Movements and politics"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:42
|
||||
#: lib/mobilizon/events/categories.ex:48
|
||||
msgid "Music"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:86
|
||||
#: lib/mobilizon/events/categories.ex:92
|
||||
msgid "Networking"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:106
|
||||
#: lib/mobilizon/events/categories.ex:112
|
||||
msgid "Outdoors & Adventure"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:90
|
||||
#: lib/mobilizon/events/categories.ex:96
|
||||
msgid "Party"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:94
|
||||
#: lib/mobilizon/events/categories.ex:100
|
||||
msgid "Performing & Visual Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:98
|
||||
#: lib/mobilizon/events/categories.ex:104
|
||||
msgid "Pets"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:102
|
||||
#: lib/mobilizon/events/categories.ex:108
|
||||
msgid "Photography"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:114
|
||||
#: lib/mobilizon/events/categories.ex:120
|
||||
msgid "Science & Tech"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:110
|
||||
#: lib/mobilizon/events/categories.ex:116
|
||||
msgid "Spirituality, Religion & Beliefs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:118
|
||||
#: lib/mobilizon/events/categories.ex:124
|
||||
msgid "Sports"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:122
|
||||
#: lib/mobilizon/events/categories.ex:128
|
||||
msgid "Theatre"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more: %{url}"
|
||||
msgstr ""
|
||||
|
@ -1599,11 +1599,6 @@ msgstr ""
|
||||
msgid "Participate:"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more : %{url}"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/card/_title.text.eex:1
|
||||
msgid "Title: %{title}"
|
||||
@ -1853,151 +1848,156 @@ msgid "View the details"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:10
|
||||
#: lib/mobilizon/events/categories.ex:16
|
||||
msgid "Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:46
|
||||
#: lib/mobilizon/events/categories.ex:52
|
||||
msgid "Auto, boat and air"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:14
|
||||
#: lib/mobilizon/events/categories.ex:20
|
||||
msgid "Book clubs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:18
|
||||
#: lib/mobilizon/events/categories.ex:24
|
||||
msgid "Business"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:22
|
||||
#: lib/mobilizon/events/categories.ex:28
|
||||
msgid "Causes"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:26
|
||||
#: lib/mobilizon/events/categories.ex:32
|
||||
msgid "Comedy"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:50
|
||||
#: lib/mobilizon/events/categories.ex:56
|
||||
msgid "Community"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:30
|
||||
#: lib/mobilizon/events/categories.ex:36
|
||||
msgid "Crafts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:54
|
||||
#: lib/mobilizon/events/categories.ex:60
|
||||
msgid "Family & Education"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:58
|
||||
#: lib/mobilizon/events/categories.ex:64
|
||||
msgid "Fashion & Beauty"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:62
|
||||
#: lib/mobilizon/events/categories.ex:68
|
||||
msgid "Film & Media"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:34
|
||||
#: lib/mobilizon/events/categories.ex:40
|
||||
msgid "Food & Drink"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:66
|
||||
#: lib/mobilizon/events/categories.ex:72
|
||||
msgid "Games"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:38
|
||||
#: lib/mobilizon/events/categories.ex:44
|
||||
msgid "Health"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:78
|
||||
#: lib/mobilizon/events/categories.ex:84
|
||||
msgid "LGBTQ"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:70
|
||||
#: lib/mobilizon/events/categories.ex:76
|
||||
msgid "Language & Culture"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:74
|
||||
#: lib/mobilizon/events/categories.ex:80
|
||||
msgid "Learning"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:127
|
||||
#: lib/mobilizon/events/categories.ex:133
|
||||
msgid "Meeting"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:82
|
||||
#: lib/mobilizon/events/categories.ex:88
|
||||
msgid "Movements and politics"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:42
|
||||
#: lib/mobilizon/events/categories.ex:48
|
||||
msgid "Music"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:86
|
||||
#: lib/mobilizon/events/categories.ex:92
|
||||
msgid "Networking"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:106
|
||||
#: lib/mobilizon/events/categories.ex:112
|
||||
msgid "Outdoors & Adventure"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:90
|
||||
#: lib/mobilizon/events/categories.ex:96
|
||||
msgid "Party"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:94
|
||||
#: lib/mobilizon/events/categories.ex:100
|
||||
msgid "Performing & Visual Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:98
|
||||
#: lib/mobilizon/events/categories.ex:104
|
||||
msgid "Pets"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:102
|
||||
#: lib/mobilizon/events/categories.ex:108
|
||||
msgid "Photography"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:114
|
||||
#: lib/mobilizon/events/categories.ex:120
|
||||
msgid "Science & Tech"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:110
|
||||
#: lib/mobilizon/events/categories.ex:116
|
||||
msgid "Spirituality, Religion & Beliefs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:118
|
||||
#: lib/mobilizon/events/categories.ex:124
|
||||
msgid "Sports"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:122
|
||||
#: lib/mobilizon/events/categories.ex:128
|
||||
msgid "Theatre"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more: %{url}"
|
||||
msgstr ""
|
||||
|
@ -1851,11 +1851,6 @@ msgstr "S'ha aprovat la participació"
|
||||
msgid "Participate:"
|
||||
msgstr "S'ha aprovat la participació"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more : %{url}"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/card/_title.text.eex:1
|
||||
msgid "Title: %{title}"
|
||||
@ -2113,151 +2108,156 @@ msgid "View the details"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:10
|
||||
#: lib/mobilizon/events/categories.ex:16
|
||||
msgid "Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:46
|
||||
#: lib/mobilizon/events/categories.ex:52
|
||||
msgid "Auto, boat and air"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:14
|
||||
#: lib/mobilizon/events/categories.ex:20
|
||||
msgid "Book clubs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:18
|
||||
#: lib/mobilizon/events/categories.ex:24
|
||||
msgid "Business"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:22
|
||||
#: lib/mobilizon/events/categories.ex:28
|
||||
msgid "Causes"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:26
|
||||
#: lib/mobilizon/events/categories.ex:32
|
||||
msgid "Comedy"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:50
|
||||
#: lib/mobilizon/events/categories.ex:56
|
||||
msgid "Community"
|
||||
msgstr "Comentaris"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:30
|
||||
#: lib/mobilizon/events/categories.ex:36
|
||||
msgid "Crafts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:54
|
||||
#: lib/mobilizon/events/categories.ex:60
|
||||
msgid "Family & Education"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:58
|
||||
#: lib/mobilizon/events/categories.ex:64
|
||||
msgid "Fashion & Beauty"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:62
|
||||
#: lib/mobilizon/events/categories.ex:68
|
||||
msgid "Film & Media"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:34
|
||||
#: lib/mobilizon/events/categories.ex:40
|
||||
msgid "Food & Drink"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:66
|
||||
#: lib/mobilizon/events/categories.ex:72
|
||||
msgid "Games"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:38
|
||||
#: lib/mobilizon/events/categories.ex:44
|
||||
msgid "Health"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:78
|
||||
#: lib/mobilizon/events/categories.ex:84
|
||||
msgid "LGBTQ"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:70
|
||||
#: lib/mobilizon/events/categories.ex:76
|
||||
msgid "Language & Culture"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:74
|
||||
#: lib/mobilizon/events/categories.ex:80
|
||||
msgid "Learning"
|
||||
msgstr "Alerta"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:127
|
||||
#: lib/mobilizon/events/categories.ex:133
|
||||
msgid "Meeting"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:82
|
||||
#: lib/mobilizon/events/categories.ex:88
|
||||
msgid "Movements and politics"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:42
|
||||
#: lib/mobilizon/events/categories.ex:48
|
||||
msgid "Music"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:86
|
||||
#: lib/mobilizon/events/categories.ex:92
|
||||
msgid "Networking"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:106
|
||||
#: lib/mobilizon/events/categories.ex:112
|
||||
msgid "Outdoors & Adventure"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:90
|
||||
#: lib/mobilizon/events/categories.ex:96
|
||||
msgid "Party"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:94
|
||||
#: lib/mobilizon/events/categories.ex:100
|
||||
msgid "Performing & Visual Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:98
|
||||
#: lib/mobilizon/events/categories.ex:104
|
||||
msgid "Pets"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:102
|
||||
#: lib/mobilizon/events/categories.ex:108
|
||||
msgid "Photography"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:114
|
||||
#: lib/mobilizon/events/categories.ex:120
|
||||
msgid "Science & Tech"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:110
|
||||
#: lib/mobilizon/events/categories.ex:116
|
||||
msgid "Spirituality, Religion & Beliefs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:118
|
||||
#: lib/mobilizon/events/categories.ex:124
|
||||
msgid "Sports"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:122
|
||||
#: lib/mobilizon/events/categories.ex:128
|
||||
msgid "Theatre"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more: %{url}"
|
||||
msgstr ""
|
||||
|
@ -1919,11 +1919,6 @@ msgstr "Účastněte se"
|
||||
msgid "Participate:"
|
||||
msgstr "Účastněte se:"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/event_card.text.eex:9
|
||||
msgid "Read more : %{url}"
|
||||
msgstr "Více informací : %{url}"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/web/templates/email/participation/card/_title.text.eex:1
|
||||
msgid "Title: %{title}"
|
||||
@ -2209,151 +2204,156 @@ msgid "View the details"
|
||||
msgstr "Zobrazit podrobnosti"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:10
|
||||
#: lib/mobilizon/events/categories.ex:16
|
||||
msgid "Arts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:46
|
||||
#: lib/mobilizon/events/categories.ex:52
|
||||
msgid "Auto, boat and air"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:14
|
||||
#: lib/mobilizon/events/categories.ex:20
|
||||
msgid "Book clubs"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:18
|
||||
#: lib/mobilizon/events/categories.ex:24
|
||||
msgid "Business"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:22
|
||||
#: lib/mobilizon/events/categories.ex:28
|
||||
msgid "Causes"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:26
|
||||
#: lib/mobilizon/events/categories.ex:32
|
||||
msgid "Comedy"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format, fuzzy
|
||||
#: lib/mobilizon/events/categories.ex:50
|
||||
#: lib/mobilizon/events/categories.ex:56
|
||||
msgid "Community"
|
||||
msgstr "Komentáře"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:30
|
||||
#: lib/mobilizon/events/categories.ex:36
|
||||
msgid "Crafts"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:54
|
||||
#: lib/mobilizon/events/categories.ex:60
|
||||
msgid "Family & Education"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:58
|
||||
#: lib/mobilizon/events/categories.ex:64
|
||||
msgid "Fashion & Beauty"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:62
|
||||
#: lib/mobilizon/events/categories.ex:68
|
||||
msgid "Film & Media"
|
||||
msgstr ""
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/mobilizon/events/categories.ex:34
|
||||
#: lib/mobilizon/events/categories.ex:40
|
||||
msgid "Food & Drink"
|
||||
msgstr ""
|
||||