- Fixed deduplicated files from orphan media being cleanup as well

- Fixed config onboarding after initial connection
 - Fixed current actor ID not being deleted from localstorage after logout
 - Fixed missing pagination on tag exploring page
 - Fixed deleting own account
 - Fixed user profiles that could show up in group search
 - Fixed accessibility issues on the account settings page
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEExMITpfxOHHCvHn8FoGG53eDKB3MFAmEjiCQACgkQoGG53eDK
 B3Nulg/+NEnJ6b7VO8AkJw7kOIhprOMX+5+lYVpE32tHy/VD+vtYVLNHiFO7OC8n
 Cr6PK5/BKfMxaH9akyUSP8CDDYqBhNOEDWOA9FRJ3LToYIxGoiIvc1Z7/8MUYdtj
 EXBBLrVFZURPvXQA/8dECou48ihig7hWEuX/1bmRCB263bTlFRzsfYEz2NwNKvok
 80AwUPjvu91q41k2ylIo3ZoDDHZ93xcj96oBYqdm/B/YBxj+1KbEdkPiBwENKDOi
 E1GTU4seF74JWloxrvqxnJr6tTkQqpJf8pC4A8reao9ymKDzPav36Cj/ZF7k4PgK
 NfWpEU9UbzYDuehfCGWDUT0SIwwbdE0OSQg1CeadRcWbGperXLsBlqrUezvymKY5
 +Xko4ABKmexKa8KxhqUTnGKfv6Jj3dSv8fRE5BAUivHwqbEgrk5xEg+y0IrHG1Ta
 bs9f2kaaO1t6OiOsB2y0KYd+kJF8VB+zIIj5nyc8t2mG3ga/ugVAsH46SG8EZ7pe
 04ZhZEUYbdxmm/osd2Qr8E/FRLN5jf+iUiKoLglOwwQphsEHUwukGYC9yvR+rnuh
 C8TDf0/TWXx2n+pARwNYPQrF9XLPWUkXaZj/9IW+QDnzx0o5QzBId7Lnx6YqeR9M
 YMCnMnzC6txEqe6N1P3ks6obUmbu9O7Y4eqFKOVi4xWZDP3QvsA=
 =6yrT
 -----END PGP SIGNATURE-----

Merge tag '1.3.2' into chapril

- Fixed deduplicated files from orphan media being cleanup as well
- Fixed config onboarding after initial connection
- Fixed current actor ID not being deleted from localstorage after logout
- Fixed missing pagination on tag exploring page
- Fixed deleting own account
- Fixed user profiles that could show up in group search
- Fixed accessibility issues on the account settings page
This commit is contained in:
tykayn 2021-09-03 10:29:15 +02:00 committed by root
commit 716dba7998
30 changed files with 511 additions and 416 deletions

1
.gitignore vendored
View File

@ -31,6 +31,7 @@ priv/cert/
cover/
site/
test/fixtures/image_tmp.jpg
test/fixtures/picture_tmp.png
test/fixtures/DSCN0010_tmp.jpg
test/uploads/
uploads/*

View File

@ -5,7 +5,33 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 1.3.0 - 2021-08-12
## 1.3.2 - 2021-08-23
### Fixed
- Fixed deduplicated files from orphan media being cleanup as well
- Fixed config onboarding after initial connection
- Fixed current actor ID not being deleted from localstorage after logout
- Fixed missing pagination on tag exploring page
- Fixed deleting own account
- Fixed user profiles that could show up in group search
- Fixed accessibility issues on the account settings page
## 1.3.1 - 2021-08-20
### Fixed
- Fixed default listen IP and sitemap creation for Docker configurations
- Fixed issues related to user timezone setting being shown as set when it wasn't, leading to timezone sometimes missing and causing issues (#746, #815)
- Fixed issues with managing resources (#837, #838)
### Translations
- Gaelic
- Finnish
- Spanish
## 1.3.0 - 2021-08-17
### Added

View File

@ -2,7 +2,7 @@
import Config
listen_ip = System.get_env("MOBILIZON_INSTANCE_LISTEN_IP", "127.0.0.1")
listen_ip = System.get_env("MOBILIZON_INSTANCE_LISTEN_IP", "0.0.0.0")
listen_ip =
case listen_ip |> to_charlist() |> :inet.parse_address() do
@ -14,7 +14,7 @@ config :mobilizon, Mobilizon.Web.Endpoint,
server: true,
url: [host: System.get_env("MOBILIZON_INSTANCE_HOST", "mobilizon.lan")],
http: [
port: System.get_env("MOBILIZON_INSTANCE_PORT", "4000"),
port: String.to_integer(System.get_env("MOBILIZON_INSTANCE_PORT", "4000")),
ip: listen_ip
],
secret_key_base: System.get_env("MOBILIZON_INSTANCE_SECRET_KEY_BASE", "changethis")

View File

@ -1,6 +1,6 @@
{
"name": "mobilizon",
"version": "1.3.0",
"version": "1.3.2",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",

View File

@ -21,6 +21,7 @@
}}
</span>
<span
v-if="config"
v-html="
$t(
'This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.',

View File

@ -59,7 +59,7 @@
{{ $t("No resources in this folder") }}
</p>
<b-pagination
v-if="resource.children.total > RESOURCES_PER_PAGE"
v-if="resource.children && resource.children.total > RESOURCES_PER_PAGE"
:total="resource.children.total"
v-model="page"
size="is-small"

View File

@ -131,6 +131,7 @@
"Banner": "Pancarta",
"Before you can login, you need to click on the link inside it to validate your account.": "Antes de iniciar sesión, debe hacer clic en el enlace que se encuentra dentro para validar su cuenta.",
"Begins on": "Comienza en",
"Big Blue Button": "Big Blue Button",
"Bio": "Bio",
"Bold": "Negrita",
"Booking": "Reservacion",
@ -320,6 +321,7 @@
"Error while validating account": "Error al validar la cuenta",
"Error while validating participation": "Error al validar la participación",
"Error while validating participation request": "Error al validar la solicitud de participación",
"Etherpad notes": "Notas de Etherpad",
"Ethical alternative to Facebook events, groups and pages, Mobilizon is a <b>tool designed to serve you</b>. Period.": "Alternativa ética a los eventos, grupos y páginas de Facebook, Mobilizon es una <b> herramienta diseñada para servirle </b>. Período.",
"Event": "Evento",
"Event URL": "URL del evento",
@ -383,6 +385,7 @@
"Go": "Ir",
"Go to the event page": "Ir a la página del evento",
"Going as {name}": "Ir como {nombre}",
"Google Meet": "Google Meet",
"Group": "Grupo",
"Group Followers": "Seguidores del grupo",
"Group List": "Lista de grupo",
@ -466,6 +469,7 @@
"Invited": "Invitado",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Es posible que el contenido no sea accesible en esta instancia, porque esta instancia ha bloqueado los perfiles o grupos detrás de este contenido.",
"Italic": "Cursiva",
"Jisti Meet": "Jisti Meet",
"Join <b>{instance}</b>, a Mobilizon instance": "Únase a <b> {instance} </b>, una instancia de Mobilizon",
"Join group": "Unirse al grupo",
"Join group {group}": "Unirse al grupo {group}",
@ -520,6 +524,7 @@
"Members-only post": "Publicación solo para miembros",
"Mentions": "Menciones",
"Message": "Mensaje",
"Microsoft Teams": "Microsoft Teams",
"Mobilizon": "Mobilizon",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon es una red federada. Puede interactuar con este evento desde un servidor diferente.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon es un software federado, lo que significa que puede interactuar, según la configuración de su federación de administrador, con contenido de otras instancias, como unirse a grupos o eventos que se crearon en otro lugar.",
@ -848,9 +853,15 @@
"Terms": "Condiciones",
"Terms of service": "Términos de servicio",
"Text": "Texto",
"The Big Blue Button video teleconference URL": "La URL de la videoconferencia de Big Blue Button",
"The Google Meet video teleconference URL": "La URL de la videoconferencia de Google Meet",
"The Jitsi Meet video teleconference URL": "La URL de la videoconferencia de Jitsi Meet",
"The Microsoft Teams video teleconference URL": "La URL de la video teleconferencia de Microsoft Teams",
"The URL of a pad where notes are being taken collaboratively": "La URL de un bloc donde se toman notas de forma colaborativa",
"The URL of a poll where the choice for the event date is happening": "La URL de una encuesta en la que se realiza la elección de la fecha del evento",
"The URL where the event can be watched live": "La URL donde se puede ver el evento en vivo",
"The URL where the event live can be watched again after it has ended": "La URL donde se puede volver a ver el evento en vivo una vez finalizado",
"The Zoom video teleconference URL": "La URL de la video teleconferencia de Zoom",
"The account's email address was changed. Check your emails to verify it.": "Se cambió la dirección de correo electrónico de la cuenta. Revise sus correos electrónicos para verificarlo.",
"The actual number of participants may differ, as this event is hosted on another instance.": "El número real de participantes puede diferir ya que este evento se aloja en otra instancia.",
"The content came from another server. Transfer an anonymous copy of the report?": "El contenido vino de otro servidor. ¿Transferir una copia anónima del informe?",
@ -999,6 +1010,7 @@
"User settings": "Ajustes de usuario",
"Username": "Nombre de usuario",
"Users": "Los usuarios",
"Video Conference": "Video conferencia",
"View a reply": "|Ver una respuesta|Ver {totalReplies} respuestas",
"View account on {hostname} (in a new window)": "Ver cuenta en {hostname} (en una nueva ventana)",
"View all": "Ver todo",
@ -1181,6 +1193,7 @@
"Your timezone was detected as {timezone}.": "Su zona horaria se detectó como {timezone}.",
"Your timezone {timezone} isn't supported.": "Tu zona horaria {timezone} no es compatible.",
"Your upcoming events": "Tus próximos eventos",
"Zoom": "Zoom",
"Zoom in": "Zoom adelante",
"Zoom out": "Zoom atras",
"[This comment has been deleted by it's author]": "[Este comentario ha sido borrado por su autor]",
@ -1206,6 +1219,7 @@
"firstDayOfWeek": "0",
"fit the needs and uses of the people": "se ajusta a las necesidades y usos de las personas",
"full rules": "reglas completas",
"https://mensuel.framapad.org/p/some-secret-token": "https://mensuel.framapad.org/p/algun-signo-secreto",
"iCal Feed": "Suministro iCal",
"instance rules": "reglas de instancia",
"interconnect with others like it": "interconectarse con otros como él",

View File

@ -4,6 +4,7 @@
"(this folder)": "(tämä kansio)",
"(this link)": "(tämä linkki)",
"+ Add a resource": "+ Lisää resurssi",
"+ Create a post": "+ Luo viesti",
"+ Create an event": "+ Luo tapahtuma",
"+ Post a public message": "+ Julkaise julkinen viesti",
"+ Start a discussion": "+ Aloita keskustelu",
@ -18,11 +19,14 @@
"A cookie is a small file containing informations that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows to store more data.": "Evästeet ovat pieniä tiedostoja, joita verkkosivut lähettävät käyttäjän tietokoneelle käyttäjän vieraillessa verkkosivuilla. Kun käyttäjä vierailee sivulla uudelleen, sivusto tunnistaa käyttäjän selaimen evästeen avulla. Evästeisiin voidaan tallentaa käyttäjän valintoja ja muuta tietoa. Selaimen voi asettaa hylkäämään kaikki evästeet. Tällöin kuitenkin osa verkkosivun toiminnoista tai palveluista voi lakata toimimasta. Paikallisesti tallennettavat tiedot toimivat samalla tavoin, mutta niihin voidaan tallentaa suurempia tietomääriä.",
"A discussion has been created or updated": "Keskustelu on luotu tai päivitetty",
"A federated software": "Federoitu ohjelmisto",
"A fediverse account URL to follow for event updates": "Fediverse-tilin URL tapahtuman päivitysten seuraamiseksi",
"A link to a page presenting the event schedule": "Linkki tapahtuman aikataulun näyttävälle sivulle",
"A link to a page presenting the price options": "Linkki hintavaihtoehdot sisältävälle sivulle",
"A member has been updated": "Käyttäjä on päivitetty",
"A member requested to join one of my groups": "Käyttäjä pyysi liittyä yhteen ryhmistäni",
"A new version is available.": "Uusi versio on saatavilla.",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Käytössäännöille, säännöille ja ohjeille varattu tila. HTML-tunnisteita voi käyttää.",
"A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Tässä voi esitellä ylläpitäjätahoa ja tämän palvelimen erityispiirteitä. HTML-tunnisteita voi käyttää.",
"A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Tässä voi esitellä ylläpitäjätahoa ja tämän instanssin erityispiirteitä. HTML-tunnisteita voi käyttää.",
"A place to publish something to the whole world, your community or just your group members.": "Paikka, jossa voit julkaista asioita koko maailmalle, yhteisöllesi tai pelkästään ryhmäsi jäsenille.",
"A place to store links to documents or resources of any type.": "Paikka, johon voit tallentaa linkkejä dokumentteihin tai muihin resursseihin.",
"A post has been published": "Viesti on julkaistu",
@ -30,19 +34,21 @@
"A practical tool": "Kätevä työkalu",
"A resource has been created or updated": "Resurssi on luotu tai päivitetty",
"A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Lyhyt teksti instanssisi kotisivulle. Oletuksena \"Kokoonnu ⋅ Järjestä ⋅ Mobilizoi\"",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Käyttäjäystävällinen, vapauttava ja eettinen työkalu tapahtumien järjestämiseen, organisointiin ja mobilisointiin.",
"A twitter account handle to follow for event updates": "Twitter-tili, jota seurata tapahtuman päivitysten saamiseksi",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Käyttäjäystävällinen, osallistava ja eettinen työkalu tapahtumien järjestämiseen, organisointiin ja mobilisointiin.",
"A validation email was sent to {email}": "Vahvistussähköposti lähetettiin osoitteeseen {email}",
"API": "API",
"Abandon editing": "Hylkää muutokset",
"Abandon edition": "Peruuta muokkaus",
"About": "Tietoja",
"About Mobilizon": "Tietoa Mobilizonista",
"About anonymous participation": "Tietoa anonyymistä osallistumisesta",
"About anonymous participation": "Tietoa nimettömästä osallistumisesta",
"About this event": "Tietoa tapahtumasta",
"About this instance": "Tietoa tästä palvelimesta",
"About this instance": "Tietoa tästä instanssista",
"About {instance}": "Tietoja {instance}:sta",
"Accept": "Hyväksy",
"Accepted": "Hyväksytty",
"Accessibility": "Saavutettavuus",
"Accessible only to members": "Pääsy vain jäsenille",
"Accessible through link": "Pääsy linkin kautta",
"Account": "Tili",
@ -60,9 +66,10 @@
"Add a note": "Lisää merkintä",
"Add a todo": "Lisää tehtävä",
"Add an address": "Lisää osoite",
"Add an instance": "Lisää palvelin",
"Add an instance": "Lisää instanssi",
"Add new…": "Lisää uusi…",
"Add some tags": "Lisää tunnisteita",
"Add to my calendar": "Lisää omaan kalenteriin",
"Add to my calendar": "Lisää kalenteriini",
"Additional comments": "Lisäkommentit",
"Admin": "Ylläpitäjä",
"Admin settings": "Ylläpitoasetukset",
@ -76,6 +83,7 @@
"Allow all comments": "Salli kaikki kommentit",
"Allow all comments from users with accounts": "Salli kommentit kirjautuneilta käyttäjiltä",
"Allow registrations": "Salli rekisteröityminen",
"An URL to an external ticketing platform": "URL ulkoiselle lipunmyyntialustalle",
"An error has occured while refreshing the page.": "Sivua päivitettäessä tapahtui virhe.",
"An error has occured. Sorry about that. You may try to reload the page.": "Tapahtui virhe. Yritä ladata sivu uudelleen.",
"An error has occurred.": "Tapahtui virhe.",
@ -87,24 +95,24 @@
"An event I'm organizing has a new pending participation": "Organisoimassani tapahtumassa on uusi osallistumispyyntö",
"An event from one of my groups has been published": "Tapahtuma ryhmästäni on julkaistu",
"An event from one of my groups has been updated or deleted": "Tapahtuma ryhmistäni on päivitetty tai poistettu",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "Palvelin tarkoittaa palvelintietokoneelle asennettua Mobilizon-ohjelmaa. Palvelinta voi käyttää kuka tahansa, jolla on käytössään {mobilizon_software} tai jokin muu federoituva sovellus, eli se on osa niin kutsuttua fediversumia. Tämän palvelimen nimi on {instance_name}. Mobilizon on useiden palvelinten muodostama federoituva verkosto (sähköpostipalvelinten tavaan), eli eri palvelimille rekisteröityneet käyttäjät voivat olla yhteydessä toisiinsa vaikka eivät olisi rekisteröityneet samalle palvelimelle.",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "API eli ohjelmointirajapinta on tietoliikenneprotokolla, jonka avulla ohjelmistokomponentit voivat olla yhteydessä keskenään. Mobilizon-API voi esimerkiksi tarjota kolmansien osapuolten ohjelmistotyökaluille yhteyden Mobilizon-palvelimiin erilaisten toimintojen, kuten tapahtumien julkaisemisen, suorittamiseksi automaattisesti ja etänä.",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "Instanssi tarkoittaa palvelintietokoneelle asennettua Mobilizon-ohjelmaa. Instanssi voi käyttää kuka tahansa, jolla on käytössään {mobilizon_software} tai jokin muu federoituva sovellus, eli se on osa niin kutsuttua fediversumia. Tämän instanssin nimi on {instance_name}. Mobilizon on useiden palvelinten muodostama federoituva verkosto (sähköpostipalvelinten tavaan), eli eri instansseille rekisteröityneet käyttäjät voivat olla yhteydessä toisiinsa vaikka eivät olisi rekisteröityneet samalle instanssille.",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "API eli ohjelmointirajapinta on tietoliikenneprotokolla, jonka avulla ohjelmistokomponentit voivat olla yhteydessä keskenään. Mobilizon-API voi esimerkiksi tarjota kolmansien osapuolten ohjelmistotyökaluille yhteyden Mobilizon-instansseihin erilaisten toimintojen, kuten tapahtumien julkaisemisen, suorittamiseksi automaattisesti ja etänä.",
"And {number} comments": "{number} kommenttia",
"Announcements and mentions notifications are always sent straight away.": "Ilmoitukset julkistuksista ja maininnoista lähetetään aina heti.",
"Anonymous participant": "Nimetön osallistuja",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyymejä osallistujia pyydetään vahvistamaan osallistumisensa sähköpostitse.",
"Anonymous participations": "Anonyymit osallistujat",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Nimettömiä osallistujia pyydetään vahvistamaan osallistumisensa sähköpostitse.",
"Anonymous participations": "Nimettömät osallistujat",
"Any day": "Milloin vain",
"Anyone can join freely": "Kaikki voivat liittyä",
"Anyone wanting to be a member from your group will be able to from your group page.": "Kaikki ryhmäsi jäsenet voivat liittyä ryhmäsi sivuilta.",
"Application": "Sovellus",
"Approve": "Hyväksy",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Haluatko varmasti poistaa koko tilin? Tällöin kaikki poistetaan. Identiteetit, asetukset, luodut tapahtumat, viestit ja osallistumiset poistetaan pysyvästi.",
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Haluatko varmasti <b>poistaa ryhmän kokonaan</b>? Kaikille jäsenille (myös muilla palvelimilla oleville) ilmoitetaan asiasta ja heidät poistetaan ryhmästä, ja <b>kaikki ryhmän tiedot (tapahtumat, julkaisut, keskustelut, tehtävät jne.) poistetaan pysyvästi</b>.",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Haluatko varmasti poistaa koko tilisi? Tällöin kaikki poistetaan. Identiteetit, asetukset, luodut tapahtumat, viestit ja osallistumiset poistetaan pysyvästi.",
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Haluatko varmasti <b>poistaa ryhmän kokonaan</b>? Kaikille jäsenille (myös muilla instanssilla oleville) ilmoitetaan asiasta ja heidät poistetaan ryhmästä, ja <b>kaikki ryhmän tiedot (tapahtumat, julkaisut, keskustelut, tehtävät jne.) poistetaan pysyvästi</b>.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Haluatko varmasti <b>poistaa</b> tämän kommentin? Toimintoa ei voi perua.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Haluatko varmasti <b>poistaa</b> tämän tapahtuman? Toimintoa ei voi perua. Poistamisen sijaan voisit ehkä keskustella tapahtuman luojan kanssa tai muokata tapahtumaa.",
"Are you sure you want to <b>suspend</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Haluatko varmasti <b>estää</b> tämän ryhmän? Kaikille jäsenille (myös muilla palvelimilla oleville) ilmoitetaan asiasta ja heidät poistetaan ryhmästä, ja <b>kaikki ryhmän tiedot (tapahtumat, julkaisut, keskustelut, tehtävät jne.) poistetaan pysyvästi</b>.",
"Are you sure you want to <b>suspend</b> this group? As this group originates from instance {instance}, this will only remove local members and delete the local data, as well as rejecting all the future data.": "Haluatko varmasti <b>estää</b> tämän ryhmän? Koska ryhmä toimii palvelimelta {instance} käsin, estäminen poistaa siitä paikalliset jäsenet ja paikalliset tiedot sekä estää kaikki ryhmään liittyvät myöhemmät tiedot.",
"Are you sure you want to <b>suspend</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Haluatko varmasti <b>estää</b> tämän ryhmän? Kaikille jäsenille (myös muilla instanssilla oleville) ilmoitetaan asiasta ja heidät poistetaan ryhmästä, ja <b>kaikki ryhmän tiedot (tapahtumat, julkaisut, keskustelut, tehtävät jne.) poistetaan pysyvästi</b>.",
"Are you sure you want to <b>suspend</b> this group? As this group originates from instance {instance}, this will only remove local members and delete the local data, as well as rejecting all the future data.": "Haluatko varmasti <b>estää</b> tämän ryhmän? Koska ryhmä toimii instanssilta {instance} käsin, estäminen poistaa siitä paikalliset jäsenet ja paikalliset tiedot sekä estää kaikki ryhmään liittyvät myöhemmät tiedot.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Haluatko varmasti keskeyttää tapahtuman luomisen? Kaikki muutokset menetetään.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Haluatko varmasti keskeyttää tapahtuman muokkaamisen? Kaikki muutokset menetetään.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Haluatko varmasti perua osallistumisesi tapahtumaan {title}?",
@ -119,7 +127,9 @@
"Banner": "Banneri",
"Before you can login, you need to click on the link inside it to validate your account.": "Sinun on ennen sisäänkirjautumista vahvistettava tilisi napsauttamalla siinä olevaa linkkiä.",
"Begins on": "Alkaa",
"Big Blue Button": "Big Blue Button",
"Bold": "Lihavoitu",
"Booking": "Varaus",
"Breadcrumbs": "Leivänmurut",
"Browser notifications": "Selaimen ilmoitukset",
"By @{group}": "Tehnyt @{group}",
@ -130,7 +140,7 @@
"By {username} and {group}": "Tehnyt {username} ja {group}",
"Can be an email or a link, or just plain text.": "Voi olla sähköpostiosoite, linkki tai pelkkää tekstiä.",
"Cancel": "Peruuta",
"Cancel anonymous participation": "Peruuta anonyymi osallistuminen",
"Cancel anonymous participation": "Peruuta nimetön osallistuminen",
"Cancel creation": "Peruuta luonti",
"Cancel edition": "Peruuta muokkaus",
"Cancel my participation request…": "Peru osallistumispyyntöni…",
@ -242,6 +252,7 @@
"Deleting your Mobilizon account": "Poistetaan Mobilizon-tiliäsi",
"Demote": "Häivytä",
"Description": "Kuvaus",
"Details": "Yksityiskohdat",
"Didn't receive the instructions ?": "Eivätkö ohjeet tulleet perille?",
"Didn't receive the instructions?": "Etkö saanut ohjeita?",
"Disabled": "Pois käytöstä",
@ -249,7 +260,7 @@
"Display name": "Näytä nimi",
"Display participation price": "Näytä osallistumisen hinta",
"Displayed nickname": "Näytettävä nimimerkki",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Näytetään aloitussivulla ja metatunnisteissa. Kerro yhdessä kappaleessa, mikä on Mobilizon ja mikä tässä palvelimessa on erityistä.",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Näytetään aloitussivulla ja metatunnisteissa. Kerro yhdessä kappaleessa, mikä on Mobilizon ja mikä tässä instanssissa on erityistä.",
"Do not receive any mail": "Älä vastaanota mitään sähköpostia",
"Do you wish to {create_event} or {explore_events}?": "Haluatko {create_event} vai {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Haluatko {create_group} vai {explore_groups}?",
@ -264,12 +275,15 @@
"Edit post": "Muokkaa julkaisua",
"Edit profile {profile}": "Muokkaa profiilia {profile}",
"Edited {ago}": "Muokattu {ago}",
"Edited {relative_time} ago": "Muokattu {relative_time} sitten",
"Eg: Stockholm, Dance, Chess…": "Esim. Helsinki, tanssi, shakki, …",
"Either on the {instance} instance or on another instance.": "Joko palvelimella {instance} tai toisella palvelimella.",
"Either on the {instance} instance or on another instance.": "Joko instanssilla {instance} tai toisella instanssilla.",
"Either the account is already validated, either the validation token is incorrect.": "Joko tili on jo vahvistettu tai vahvistusmerkki on virheellinen.",
"Either the email has already been changed, either the validation token is incorrect.": "Joko sähköpostiosoite on jo vaihdettu tai vahvistusmerkki on virheellinen.",
"Either the participation has already been validated, either the validation token is incorrect.": "Joko osallistuminen on jo vahvistettu tai vahvistumerkki on virheellinen.",
"Either the participation request has already been validated, either the validation token is incorrect.": "Osallistumispyyntö on jo vahvistettu tai vahvistustunnus on virheellinen.",
"Element title": "Elementin nimi",
"Element value": "Elementin arvo",
"Email": "Sähköposti",
"Email address": "Sähköpostiosoite",
"Email notifications": "Sähköposti-ilmoitukset",
@ -298,6 +312,7 @@
"Error while validating account": "Virhe tilin vahvistamisessa",
"Error while validating participation": "Virhe osallistumisen vahvistamisessa",
"Error while validating participation request": "Virhe osallistumispyyntöä vahvistettaessa",
"Etherpad notes": "Etherpad-muistiinpanot",
"Ethical alternative to Facebook events, groups and pages, Mobilizon is a <b>tool designed to serve you</b>. Period.": "Eettinen vaihtoehto Facebookin tapahtumille, ryhmille ja sivuille. Mobilizon on työkalu, joka on <b>suunniteltu palvelemaan sinua</b>. Piste.",
"Event": "Tapahtuma",
"Event URL": "Tapahtuman URL",
@ -306,6 +321,7 @@
"Event creation": "Tapahtuman luonti",
"Event edition": "Tapahtuman muokkaus",
"Event list": "Tapahtumaluettelo",
"Event metadata": "Tapahtuman metadata",
"Event not found.": "Tapahtumaa ei löydy.",
"Event page settings": "Tapahtumasivun asetukset",
"Event to be confirmed": "Tapahtuma odottaa vahvistamista",
@ -325,10 +341,14 @@
"Features": "Ominaisuudet",
"Federated Group Name": "Ryhmän federaationimi",
"Federation": "Federaatio",
"Fediverse account": "Fediverse-tili",
"Fetch more": "Hae lisää",
"Filter by name": "Suodata nimen mukaan",
"Filter by profile or group name": "Suodata profiilin tai ryhmän nimen mukaan",
"Find an address": "Etsi osoitetta",
"Find an instance": "Etsi palvelinta",
"Find an instance": "Etsi instanssia",
"Find another instance": "Etsi toinen instanssi",
"Find or add an element": "Etsi tai lisää elementti",
"Followed by {count} persons": "{count} henkilöä seuraa",
"Follower": "Seuraaja",
"Followers": "Seuraajat",
@ -338,11 +358,13 @@
"For instance: London, Taekwondo, Architecture…": "Esimerkiksi: Tampere, taekwondo, arkkitehtuuri, …",
"Forgot your password ?": "Unohditko salasanasi?",
"Forgot your password?": "Unohditko salasanan?",
"Framadate poll": "Framadate-kysely",
"From a birthday party with friends and family to a march for climate change, right now, our gatherings are <b>trapped inside the tech giants platforms</b>. How can we organize, how can we click “Attend,” without <b>providing private data</b> to Facebook or <b>locking ourselves up</b> inside MeetUp?": "Kaikki tapahtumamme kaverien ja perheen kesken vietettävistä syntymäpäiväjuhlista ilmastomarsseihin ovat tätä nykyä <b>teknologiajättien armoilla</b>. Kuinka voimme järjestäytyä ja ilmoittaa osallistuvamme tapahtumiin <b>luovuttamatta yksityisiä tietojamme</b> Facebookille tai <b>joutumatta jumiin</b> MeetUpiin?",
"From the {startDate} at {startTime} to the {endDate}": "Alkaa {startDate} klo {startTime} ja päättyy {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Alkaa {startDate} klo {startTime} ja päättyy {endDate} klo {endTime}",
"From the {startDate} to the {endDate}": "Alkaa {startDate} ja päättyy {endDate}",
"From yourself": "Sinulta",
"Fully accessible with a wheelchair": "Pääsee täysin pyörätuolilla",
"Gather ⋅ Organize ⋅ Mobilize": "Kokoonnu ⋅ Järjestä ⋅ Mobilisoi",
"General": "Yleinen",
"General information": "Yleiset tiedot",
@ -353,6 +375,7 @@
"Go": "Siirry",
"Go to the event page": "Siirry tapahtumasivulle",
"Going as {name}": "Osallistu nimellä {name}",
"Google Meet": "Google Meet",
"Group": "Ryhmä",
"Group Followers": "Ryhmän seuraajat",
"Group List": "Ryhmäluettelo",
@ -370,7 +393,7 @@
"Group {displayName} created": "Ryhmä {displayName} luotu",
"Group {groupTitle} reported": "Ryhmä {groupTitle} raportoitu",
"Groups": "Ryhmät",
"Groups are not enabled on this instance.": "Ryhmät eivät ole käytössä tällä palvelimella.",
"Groups are not enabled on this instance.": "Ryhmät eivät ole käytössä tällä instanssilla.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Ryhmät ovat tapahtumien järjestämiseen, koordinointiin ja valmisteluun sekä yhteisön hallinnointiin tarkoitettuja tiloja.",
"Headline picture": "Otsikkokuva",
"Hide replies": "Piilota vastaukset",
@ -382,7 +405,7 @@
"I create an identity": "Luon indentiteetin",
"I don't have a Mobilizon account": "Minulla ei ole Mobilizon-tiliä",
"I have a Mobilizon account": "Minulla on Mobilizon-tili",
"I have an account on another Mobilizon instance.": "Minulla on tili toisella Mobilizon-palvelimella.",
"I have an account on another Mobilizon instance.": "Minulla on tili toisella Mobilizon- instanssilla.",
"I participate": "Osallistun",
"I want to allow people to participate without an account.": "Osallistuminen ilman käyttäjätiliä sallittu.",
"I want to approve every participation request": "Haluan hyväksyä kaikki osallistumispyynnöt",
@ -398,43 +421,45 @@
"If an account with this email exists, we just sent another confirmation email to {email}": "Jos osoitteeseen {email} liittyvä tili on jo olemassa, lähetämme vain uuden vahvistusviestin",
"If the direction given by the development team does not suit you, you have the legal right to create your own version of the software, with your own governance choices.": "Jos kehitystiimin valitsema suunta ei miellytä sinua, sinulla on juridinen oikeus luoda ohjelmasta oma versio ja noudattaa siinä omia hallinnollisia valintojasi.",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Jos tämä identiteetti on joidenkin ryhmien ainoa ylläpitäjä, ryhmät on poistettava ennen kuin identiteetin voi poistaa.",
"If you are being asked for your federated indentity, it's composed of your username and your instance. For instance, the federated identity for your first profile is:": "Jos sinulta kysytään federoitua käyttäjätunnustasi, se koostuu käyttäjätunnuksestasi ja palvelimestasi. Esimerkiksi ensimmäisellä profiilillasi se on:",
"If you are being asked for your federated indentity, it's composed of your username and your instance. For instance, the federated identity for your first profile is:": "Jos sinulta kysytään federoitua käyttäjätunnustasi, se koostuu käyttäjätunnuksestasi ja instanssistasi. Esimerkiksi ensimmäisellä profiilillasi se on:",
"If you have opted for manual validation of participants, Mobilizon will send you an email to inform you of new participations to be processed. You can choose the frequency of these notifications below.": "Jos olet valinnut osallistujien manuaalisen vahvistuksen, Mobilizon lähettää sinulle viestin uusista osallistujista jotka voit vahvistaa. Voit alla valita näiden viestien tiheyden.",
"If you want, you may send a message to the event organizer here.": "Tästä voit halutessasi lähettää tapahtuman järjestäjälle viestin.",
"Ignore": "Sivuuta",
"Impossible to login, your email or password seems incorrect.": "Sisäänkirjautuminen ei onnistu, sähköposti tai salasana on väärin.",
"In the following context, an application is a software, either provided by the Mobilizon team or by a 3rd-party, used to interact with your instance.": "Seuraavassa sovellus tarkoittaa Mobilizon-tiimin tai kolmannen osapuolen toimittamaa ohjelmaa, jonka kautta palvelinta käytetään.",
"In the following context, an application is a software, either provided by the Mobilizon team or by a 3rd-party, used to interact with your instance.": "Seuraavassa sovellus tarkoittaa Mobilizon-tiimin tai kolmannen osapuolen toimittamaa ohjelmaa, jonka kautta instanssia käytetään.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Huomaathan, että tämä ohjelma ei ole (vielä) kokonaan valmis. Lue lisää: {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Asentamalla Mobilizonin yhteisöt voivat luoda <b>oman tapahtuma-alustansa</b> ja vapautua teknologiajättien palveluista.",
"Instance": "Palvelin",
"Instance": "Instanssi",
"Instance Description": "Palvelimen kuvaus",
"Instance Long Description": "Palvelimen pitkä kuvaus",
"Instance Name": "Palvelimen nimi",
"Instance Privacy Policy": "Palvelimen tietosuojakäytäntö",
"Instance Privacy Policy Source": "Palvelimen tietosuojakäytännön lähde",
"Instance Privacy Policy URL": "Palvelimen tietosuojakäytännön osoite",
"Instance Rules": "Palvelimen säännöt",
"Instance Short Description": "Palvelimen lyhyt kuvaus",
"Instance Slogan": "Instanssin mietelause",
"Instance Terms": "Palvelimen käyttöehdot",
"Instance Terms Source": "Palvelimen käyttöehtojen lähde",
"Instance Long Description": "Instanssin pitkä kuvaus",
"Instance Name": "Instanssin nimi",
"Instance Privacy Policy": "Instanssin tietosuojakäytäntö",
"Instance Privacy Policy Source": "Instanssin tietosuojakäytännön lähde",
"Instance Privacy Policy URL": "Instanssin tietosuojakäytännön osoite",
"Instance Rules": "Instanssin säännöt",
"Instance Short Description": "Instanssin lyhyt kuvaus",
"Instance Slogan": "Instanssin iskulause",
"Instance Terms": "Instanssin käyttöehdot",
"Instance Terms Source": "Instanssin käyttöehtojen lähde",
"Instance Terms URL": "Pälvelimen käyttöehtojen URL",
"Instance administrator": "Palvelimen ylläpitäjä",
"Instance configuration": "Palvelimen asetukset",
"Instance administrator": "Instanssin ylläpitäjä",
"Instance configuration": "Instanssin asetukset",
"Instance feeds": "Instanssin syötteet",
"Instance languages": "Instanssin kielet",
"Instance rules": "Palvelimen säännöt",
"Instance settings": "Palvelimen asetukset",
"Instances": "Palvelimet",
"Instance rules": "Instanssin säännöt",
"Instance settings": "Instanssin asetukset",
"Instances": "Instanssit",
"Instances following you": "Instanssit, jotka seuraavat sinua",
"Instances you follow": "Instanssit, joita seuraat",
"Integrate this event with 3rd-party tools and show metadata for the event.": "Integroi tämä tapahtuma kolmannen osapuolen työkalujen kanssa ja näytä metadata tapahtumalle.",
"Interact with a remote content": "Vuorovaikuta ulkoisen sisällön kanssa",
"Invite a new member": "Kutsu uusi jäsen",
"Invite member": "Kutsu jäsen",
"Invited": "Kutsuttu",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Sisältö ei ole käytettävissä tämän palvelimen kautta mahdollisesti siksi, että tämä palvelin on estänyt sisällön taustalla olevat profiilit tai ryhmät.",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Sisältö ei ole käytettävissä tämän palvelimen kautta mahdollisesti siksi, että tämä instanssi on estänyt sisällön taustalla olevat profiilit tai ryhmät.",
"Italic": "Kursivoitu",
"Join <b>{instance}</b>, a Mobilizon instance": "Liity Mobilizon-palvelimelle <b>{instance}</b>",
"Jisti Meet": "Jitsi-tapaaminen",
"Join <b>{instance}</b>, a Mobilizon instance": "Liity Mobilizon- instanssille <b>{instance}</b>",
"Join group": "Liity ryhmään",
"Join group {group}": "Liity ryhmään {group}",
"Join {instance}, a Mobilizon instance": "Liity Mobilizon-palvelimelle {instance}",
@ -462,6 +487,7 @@
"License": "Käyttöoikeussopimus",
"Limited number of places": "Paikkoja rajoitettu määrä",
"List title": "Luettelon otsikko",
"Live": "Suora lähetys",
"Load more": "Lataa lisää",
"Load more activities": "Lataa lisää toimintaa",
"Loading comments…": "Ladataan kommentteja…",
@ -472,7 +498,7 @@
"Log out": "Kirjaudu ulos",
"Login": "Kirjaudu sisään",
"Login on Mobilizon!": "Kirjaudu sisään Mobilizoniin!",
"Login on {instance}": "Kirjaudu palvelimelle {instance}",
"Login on {instance}": "Kirjaudu instanssille {instance}",
"Login status": "Kirjautumisen tila",
"Main languages you/your moderators speak": "Pääkieli, jota sinä ja moderaattorisi puhuvat",
"Manage my notifications": "Hallinnoi ilmoituksia",
@ -483,14 +509,16 @@
"Mark as resolved": "Merkitse ratkaistuksi",
"Member": "Jäsen",
"Members": "Jäsenet",
"Members-only post": "Vain jäsenille näkyvä viesti",
"Mentions": "Maininnat",
"Message": "Viesti",
"Microsoft Teams": "Microsoft Teams",
"Mobilizon": "Mobilizon",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon on federoituva verkosto. Tätä tapahtumasivua voi käyttää myös toiselta palvelimelta.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon on federoitu palvelu, minkä ansiosta voit viestiä myös muilla palvelimilla olevien käyttäjien ja ryhmien kanssa ja ilmoittautua niillä oleviin tapahtumiin.",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon on federoituva verkosto. Tätä tapahtumasivua voi käyttää myös toiselta instanssilta.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon on federoitu palvelu, minkä ansiosta voit viestiä myös muilla instansseilla olevien käyttäjien ja ryhmien kanssa ja ilmoittautua niillä oleviin tapahtumiin.",
"Mobilizon is a free/libre software that will allow communities to create <b>their own spaces</b> to publish events in order to better emancipate themselves from tech giants.": "Mobilizon on vapaa ja ilmainen ohjelma, jonka avulla yhteisöt voivat luoda <b>omia tilojaan</b> tapahtumailmoittelua varten ja näin vapautua teknologiajättien ikeestä.",
"Mobilizon is a tool that helps you <b>find, create and organise events</b>.": "Mobilizon on työkalu, jolla pystyt <b>hakemaan, luomaan ja järjestämään tapahtumia</b>.",
"Mobilizon is not a giant platform, but a <b>multitude of interconnected Mobilizon websites</b>.": "Mobilizon ei ole jättiläismäinen keskitetty alusta vaan <b>suuri joukko tosiinsa yhdistyneitä Mobilizon-palvelimia</b>.",
"Mobilizon is not a giant platform, but a <b>multitude of interconnected Mobilizon websites</b>.": "Mobilizon ei ole jättiläismäinen keskitetty alusta vaan <b>suuri joukko tosiinsa yhdistyneitä Mobilizon-instansseja</b>.",
"Mobilizon is not developed by a secretive start-up, but by a group of friends who strive to {change_world}. So while we do work slower, we remain attentive and in touch with our users.": "Mobilizonia ei kehitä mikään salamyhkäinen startup-yritys, vaan ystäväporukka, jonka tavoitteena on {change_world}. Vaikka työmme etenee hitaammin, olemme silti valppaina ja pidämme yhteyttä käyttäjiimme.",
"Mobilizon is under development, we will add new features to this site during regular updates, until the release of <b>version 1 of the software in the fall of 2020</b>.": "Mobilizonin kehitystyö on vielä kesken, ja tälle sivulle lisätään säännöllisesti uusia ominaisuuksia, kunnes <b>ohjelman versio 1 julkaistaan syksyllä 2020</b>.",
"Mobilizon is under development, we will add new features to this site during regular updates, until the release of <b>version 1 of the software in the first half of 2020</b>.": "Mobilizonin kehitystyö on vielä käynnissä, ja tälle sivulle lisätään säännöllisesti uusia ominaisuuksia, kunnes <b>ohjelman versio 1 julkaistaan vuoden 2020 alkupuoliskolla</b>.",
@ -511,7 +539,7 @@
"My events": "Omat tapahtumat",
"My groups": "Omat ryhmät",
"My identities": "Omat identiteetit",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "HUOM! Oletusehdot eivät ole juristin tarkistamia, joten palvelimen ylläpitäjän ei ole syytä luottaa niiden tarjoamaan juridiseen suojaan. Niitä ei ole myöskään sovitettu eri maiden ja lainkäyttöalueiden olosuhteisiin. Epävarmoissa tilanteissa suosittelemme tarkistuttamaan ehdot lakiasiantuntijalla.",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "HUOM! Oletusehdot eivät ole juristin tarkistamia, joten instanssin ylläpitäjän ei ole syytä luottaa niiden tarjoamaan juridiseen suojaan. Niitä ei ole myöskään sovitettu eri maiden ja lainkäyttöalueiden olosuhteisiin. Epävarmoissa tilanteissa suosittelemme tarkistuttamaan ehdot lakiasiantuntijalla.",
"Name": "Nimi",
"New discussion": "Uusi keskustelu",
"New email": "Uusi sähköpostiosoite",
@ -539,10 +567,10 @@
"No group matches the filters": "Yksikään ryhmä ei vastaa suodattimia",
"No groups found": "Ryhmiä ei löytynyt",
"No information": "Ei tietoa",
"No instance follows your instance yet.": "Mikään palvelin ei vielä seuraa tätä palvelinta.",
"No instance to approve|Approve instance|Approve {number} instances": "Ei hyväksyttäviä palvelimia|Hyväksy palvelin|Hyväksy {number} palvelinta",
"No instance to reject|Reject instance|Reject {number} instances": "Ei hylättäviä palvelimia|Hylkää palvelin|Hylkää {number} palvelinta",
"No instance to remove|Remove instance|Remove {number} instances": "Ei poistettavia palvelimia|Poista palvelin|Poista {number} palvelinta",
"No instance follows your instance yet.": "Mikään instanssi ei vielä seuraa tätä instanssia.",
"No instance to approve|Approve instance|Approve {number} instances": "Ei hyväksyttäviä instansseja|Hyväksy instanssi|Hyväksy {number} instanssia",
"No instance to reject|Reject instance|Reject {number} instances": "Ei hylättäviä instansseja|Hylkää instanssi|Hylkää {number} instanssia",
"No instance to remove|Remove instance|Remove {number} instances": "Ei poistettavia instansseja|Poista instanssi|Poista {number} instanssia",
"No languages found": "Kieliä ei löytynyt",
"No member matches the filters": "Ei suodattimia vastaavia jäseniä",
"No members found": "Käyttäjiä ei löydy",
@ -572,9 +600,11 @@
"No resources selected": "Ei valittuja resursseja|Yksi resurssi valittu|{count} resurssia valittu",
"No resources yet": "Ei resursseja vielä",
"No results for \"{queryText}\"": "Ei tuloksia haulle ”{queryText}”",
"No results for {search}": "Ei tuloksia haulle {search}",
"No rules defined yet.": "Sääntöjä ei ole vielä määritelty.",
"No user account with this email was found. Maybe you made a typo?": "Tällä sähköpostiosoitteella ei löytynyt käyttäjätiliä. Tarkista kirjoitusasu.",
"None": "Ei mitään",
"Not accessible with a wheelchair": "Ei pääse pyörätuolilla",
"Not approved": "Ei hyväksytty",
"Not confirmed": "Vahvistamaton",
"Notes": "Merkinnät",
@ -593,9 +623,10 @@
"On {date} ending at {endTime}": "{date}, päättyy {endTime}",
"On {date} from {startTime} to {endTime}": "{date} klo {startTime}{endTime}",
"On {date} starting at {startTime}": "{date} klo {startTime}",
"On {instance} and other federated instances": "Instanssilla {instance} ja muilla federoiduilla instansseilla",
"On {instance} and other federated instances": "Instanssi {instance} ja muilla federoiduilla instansseilla",
"One person is going": "Kukaan ei ole menossa | Yksi henkilö menossa | {approved} henkilöä menossa",
"Ongoing tasks": "Meneillään olevat tehtävät",
"Online ticketing": "Lipunmyynti verkossa",
"Only accessible through link": "Pääsy vain linkistä",
"Only accessible through link (private)": "Pääsy vain linkin kautta (yksityinen)",
"Only accessible through link and search (private)": "Pääsy vain linkin ja hakutoiminnon kautta (yksityinen)",
@ -603,6 +634,7 @@
"Only alphanumeric characters and underscores are supported.": "Vain kirjaimet, numerot ja alaviiva ovat sallittuja.",
"Only alphanumeric lowercased characters and underscores are supported.": "Vain pieniä kirjaimia (a-z), numeroita ja alaviivaa voi käyttää.",
"Only group members can access discussions": "Vain ryhmän jäsenet voivat päästä keskusteluihin",
"Only group moderators can create, edit and delete events.": "Vain ryhmän moderaattorit voivat luoda, muokata ja poistaa tapahtumia.",
"Only group moderators can create, edit and delete posts.": "Vain ryhmän moderaattorit voivat luode, muokata ja poistaa viestejä.",
"Open": "Avoin",
"Open a topic on our forum": "Luo uusi aihe foorumillamme",
@ -626,6 +658,7 @@
"Page limited to my group (asks for auth)": "Sivu rajattu omalle ryhmälle (vaatii tunnistautumista)",
"Page not found": "Sivua ei löydy",
"Parent folder": "Yläkansio",
"Partially accessible with a wheelchair": "Pääsee osittain pyörätuolilla",
"Participant": "Osallistuja",
"Participant already was rejected.": "Osallistuja on jo hylätty.",
"Participant has already been approved as participant.": "Osallistuja on jo hyväksytty.",
@ -642,6 +675,8 @@
"Password change": "Salasanan vaihto",
"Password reset": "Salasanan palautus",
"Past events": "Menneet tapahtumat",
"PeerTube live": "PeerTube-livelähetys",
"PeerTube replay": "PeerTube-uudelleentoisto",
"Pending": "Odottaa",
"Personal feeds": "Henkilökohtaiset syötteet",
"Pick": "Valitse",
@ -651,7 +686,7 @@
"Pick an instance": "Valitse instanssi",
"Please add as many details as possible to help identify the problem.": "Laita niin monta yksityiskohtaa kuin mahdollista, jotta voimme tunnistaa ongelman.",
"Please check your spam folder if you didn't receive the email.": "Jos et saanut sähköpostia, tarkista roskapostikansio.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Jos epäilet tätä virheeksi, ota yhteyttä tämän palvelimen Mobilizon-ylläpitäjään.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Jos epäilet tätä virheeksi, ota yhteyttä tämän instanssin Mobilizon-ylläpitäjään.",
"Please do not use it in any real way.": "Älä käytä todellisiin tarkoituksiin.",
"Please enter your password to confirm this action.": "Vahvista toimenpide syöttämällä salasanasi.",
"Please make sure the address is correct and that the page hasn't been moved.": "Varmista, että osoite on oikein eikä sivua ole siirretty.",
@ -669,6 +704,7 @@
"Preferences": "Valinnat",
"Previous": "Edellinen",
"Previous page": "Edellinen sivu",
"Price sheet": "Hintalappu",
"Privacy Policy": "Tietosuojakäytäntö",
"Privacy policy": "Tietosuojakäytäntö",
"Private event": "Yksityistapahtuma",
@ -697,6 +733,7 @@
"Recap every week": "Muistutus joka viikko",
"Receive one email for each activity": "Vastaanota yksi sähköposti jokaista toimintoa kohden",
"Receive one email per request": "Vastaanota sähköposti jokaisesta pyynnöstä",
"Redirecting in progress…": "Uudelleenohjaus käynnissä…",
"Redirecting to content…": "Ohjataan sisältöön…",
"Redirecting to event…": "Siirrytään tapahtumaan…",
"Refresh profile": "Päivitä profiili",
@ -704,9 +741,9 @@
"Region": "Alue",
"Register": "Rekisteröidy",
"Register an account on Mobilizon!": "Rekisteröi Mobilizon-tili!",
"Register an account on {instanceName}!": "Rekisteröi tili palvelimelle {instanceName}!",
"Register an account on {instanceName}!": "Rekisteröi tili instanssille {instanceName}!",
"Register for an event by choosing one of your identities": "Ilmoittaudu tapahtumaan valitsemalla jokin identiteeteistäsi",
"Register on this instance": "Rekisteröidy tälle palvelimelle",
"Register on this instance": "Rekisteröidy tälle instanssille",
"Registration is allowed, anyone can register.": "Rekisteröityminen on sallittu, kuka tahansa voi rekisteröityä.",
"Registration is closed.": "Rekisteröityminen on pois käytöstä.",
"Registration is currently closed.": "Rekisteröityminen on tällä hetkellä pois käytöstä.",
@ -721,6 +758,7 @@
"Rename": "Nimeä uudelleen",
"Rename resource": "Nimeä resurssi uudelleen",
"Reopen": "Avaa uudelleen",
"Replay": "Uudelleentoisto",
"Reply": "Vastaa",
"Report": "Raportoi",
"Report #{reportNumber}": "Raportti nro {reportNumber}",
@ -729,7 +767,7 @@
"Report this group": "Raportoi tämä ryhmä ylläpidolle",
"Reported": "Raportoitu",
"Reported by": "Raportoinut",
"Reported by someone on {domain}": "Raportoitu palvelimelta {domain}",
"Reported by someone on {domain}": "Raportoitu instanssilta {domain}",
"Reported by {reporter}": "Raportoinut {reporter}",
"Reported group": "Ryhmä raportoitu",
"Reported identity": "Raportoitu identiteetti",
@ -750,6 +788,7 @@
"SSL/TLS": "SSL/TLS",
"Save": "Tallenna",
"Save draft": "Tallenna luonnos",
"Schedule": "Aikataulu",
"Search": "Hae",
"Search events, groups, etc.": "Etsi tapahtumia, ryhmiä jne.",
"Search results: \"{search}\"": "Hakutulokset: ”{search}”",
@ -767,20 +806,23 @@
"Send the confirmation email again": "Lähetä vahvistussähköposti uudelleen",
"Send the report": "Lähetä raportti",
"Set an URL to a page with your own privacy policy.": "Aseta osoitteeksi oman tietosuojakäytäntösivun osoite.",
"Set an URL to a page with your own terms.": "Aseta palvelimen käyttöehdot sisältävän sivun URL.",
"Set an URL to a page with your own terms.": "Aseta instanssin käyttöehdot sisältävän sivun URL.",
"Settings": "Asetukset",
"Share": "Jaa",
"Share this event": "Jaa tapahtuma",
"Share this group": "Jaa tämä ryhmä",
"Short bio": "Lyhyt kuvaus",
"Show map": "Näytä kartta",
"Show me where I am": "Näytä missä olen",
"Show remaining number of places": "Näytä vapaana olevien paikkojen määrä",
"Show the time when the event begins": "Näytä tapahtuman alkamisaika",
"Show the time when the event ends": "Näytä tapahtuman päättymisaika",
"Sign Language": "Viittomakieli",
"Sign in with": "Kirjaudu käyttäen",
"Sign up": "Luo tili",
"Since you are a new member, private content can take a few minutes to appear.": "Koska olet uusi jäsen, yksityisen sisällön näkymisessä voi kestää joitakin minuutteja.",
"So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "Näin ollen Mobilizon {fit_needs_uses_people} heti alusta alkaen.",
"Social": "Sosiaalinen",
"Software to the people": "Ohjelmia ihmisille",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Joidenkin seuraavassa tekstissä käytettyjen teknisten ja muiden termien tarkoittamat käsitteet voivat olla mutkikkaita. Tämä sanasto auttaa niiden ymmärtämisessä:",
"Starts on…": "Alkaa…",
@ -788,6 +830,7 @@
"Statut": "Tila",
"Street": "Katuosoite",
"Submit": "Lähetä",
"Subtitles": "Tekstitykset",
"Suspend": "Estä",
"Suspend group": "Estä ryhmä",
"Suspended": "Estetty",
@ -798,16 +841,29 @@
"Terms": "Käyttöehdot",
"Terms of service": "Käyttöehdot",
"Text": "Teksti",
"The Big Blue Button video teleconference URL": "Big Blue Button -videokokouksen URL",
"The Google Meet video teleconference URL": "Google Meet -videokokouksen URL",
"The Jitsi Meet video teleconference URL": "Jitsi Meet -videokokouksen URL",
"The Microsoft Teams video teleconference URL": "Microsoft Teams -videokokouksen URL",
"The URL of a pad where notes are being taken collaboratively": "Muistikirjan URL, jossa muistiinpanoja tehdään yhdessä",
"The URL of a poll where the choice for the event date is happening": "Kyselyn URL, jonka kautta tapahtuu tapahtuman päivämäärän valinta",
"The URL where the event can be watched live": "URL, jonka kautta tapahtumaa voi seurata tosiaikaisesti",
"The URL where the event live can be watched again after it has ended": "URL, jonka kautta tapahtuman live-esitystä voi katsoa uudestaan päättymisen jälkeen",
"The Zoom video teleconference URL": "Zoom-videokokouksen URL",
"The account's email address was changed. Check your emails to verify it.": "Tilin sähköpostiosoite vaihdettiin. Katso vahvistusviesti sähköpostistasi.",
"The actual number of participants may differ, as this event is hosted on another instance.": "Koska tapahtumasivu sijaitsee toisella palvelimella, osallistujien todellinen määrä voi poiketa tästä.",
"The content came from another server. Transfer an anonymous copy of the report?": "Sisältö on peräisin toiselta palvelimelta. Lähetetäänkö raportista sinne anonyymi kopio?",
"The actual number of participants may differ, as this event is hosted on another instance.": "Koska tapahtumasivu sijaitsee toisella instanssilla, osallistujien todellinen määrä voi poiketa tästä.",
"The content came from another server. Transfer an anonymous copy of the report?": "Sisältö on peräisin toiselta instanssilta. Lähetetäänkö raportista sinne nimetön kopio?",
"The current identity doesn't have any permission on this event. You should probably change it.": "Nykyisellä identiteetillä ei ole tapahtumaan liittyviä oikeuksia. Vaihda toiseen identiteettiin.",
"The current password is invalid": "Nykyinen salasana ei kelpaa",
"The draft event has been updated": "Tapahtumaluonnosta on päivitetty",
"The event has a sign language interpreter": "Tapahtumalla on viittomakielen tulkki",
"The event has been created as a draft": "Tapahtuma on luotu luonnoksena",
"The event has been published": "Tapahtuma on julkaistu",
"The event has been updated": "Tapahtuma on päivitetty",
"The event has been updated and published": "Tapahtuma on päivitetty ja julkaistu",
"The event hasn't got a sign language interpreter": "Tapahtumalla ei ole viittomakielen tulkkia",
"The event live video contains subtitles": "Tapahtuman live-lähetys sisältää tekstitykset",
"The event live video does not contain subtitles": "Tapahtuman live-lähetys ei sisällä tekstityksiä",
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "Tapahtuman järjestäjä haluaa hyväksyä osallistujat käsin. Haluatko lisätä maininnan, jossa kerrot, miksi haluat osallistua tapahtumaan?",
"The event organizer didn't add any description.": "Tapahtuman järjestäjä ei ole lisännyt kuvausta.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Tapahtuman järjestäjä hyväksyy osallistujat käsin. Koska olet päättänyt osallistua ilman tiliä, kerro, miksi haluat osallistua tapahtumaan.",
@ -827,7 +883,7 @@
"The group's banner was changed.": "Ryhmän banneri muutettiin.",
"The group's physical address was changed.": "Ryhmän osoite muutettiin.",
"The group's short description was changed.": "Ryhmän lyhyt kuvaus muutettiin.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "Palvelimen ylläpitäjä on tämän Mobilizon-palvelimen toiminnasta vastaava henkilö tai taho.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "Instanssin ylläpitäjä on tämän Mobilizon-instanssin toiminnasta vastaava henkilö tai taho.",
"The member was removed from the group {group}": "Jäsen poistettiin ryhmästä {group}",
"The new email doesn't seem to be valid": "Uusi sähköpostiosoite ei kelpaa",
"The new email must be different": "Uuden sähköpostiosoitteen on oltava eri kuin vanhan",
@ -840,7 +896,7 @@
"The post {post} was created by {profile}.": "Viestin {post} loi {profile}.",
"The post {post} was deleted by {profile}.": "Viestin {post} poisti {profile}.",
"The post {post} was updated by {profile}.": "Viestiä {post} päivitti {profile}.",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Raportti lähetetään oman palvelimesi moderaattoreille. Alla voit kertoa, miksi raportoit sisällöstä.",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Raportti lähetetään oman instanssisi moderaattoreille. Alla voit kertoa, miksi raportoit sisällöstä.",
"The selected picture is too heavy. You need to select a file smaller than {size}.": "Valittu kuva on liian iso. Valitse tiedosto, joka on pienempi kuin {size}.",
"The technical details of the error can help developers solve the problem more easily. Please add them to your feedback.": "Virheen tekniset yksityiskohdat voivat auttaa kehittäjiä ratkaisemaan ongelman helpommin. Lisää ne palautteeseesi, kiitos.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Käyttäjätiliä, jolla yrität kirjautua, ei ole vielä vahvistettu. Tarkista sähköpostilaatikkosi ja tarvittaessa roskapostikansiosi.",
@ -853,7 +909,8 @@
"These events may interest you": "Nämä tapahtumat saattavat kiinnostaa sinua",
"These feeds contain event data for the events for which any of your profiles is a participant or creator. You should keep these private. You can find feeds for specific profiles on each profile edition page.": "Nämä syötteet sisältävät tapahtumadataa tapahtumille, joissa jokin profiileistasi on osallistuja tai luoja. Sinun tulisi pitää nämä yksityisinä. Voit löytää syötteet tietyille profiileille jokaisen profiilin sivuilta.",
"These feeds contain event data for the events for which this specific profile is a participant or creator. You should keep these private. You can find feeds for all of your profiles into your notification settings.": "Nämä syötteet sisältävät tapahtumadataa tapahtumille, joissa tämä tietty profiili on osallistuja tai luoja. Sinun pitäisi pitää nämä yksityisinä. Voit löytää kaikkien profiiliesi syötteet ilmoitusasetuksista.",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Anonyymi osallistuminen on sallittua tällä Mobilizon-palvelimella ja tähän tapahtumaan, mutta osallistuminen on vahvistettava sähköpostitse.",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Nimetön osallistuminen on sallittua tällä Mobilizon-instanssilla ja tähän tapahtumaan, mutta osallistuminen on vahvistettava sähköpostitse.",
"This URL doesn't seem to be valid": "Tämä URL ei näytä olevan toimiva",
"This URL is not supported": "Osoite ei ole tuettu",
"This email is already registered as participant for this event": "Sähköpostiosoite on jo kirjattu tapahtuman osallistujiin",
"This email is already used.": "Sähköpostiosoite on jo käytössä.",
@ -867,13 +924,14 @@
"This information is saved only on your computer. Click for details": "Nämä tiedot tallennetaan vain omalle tietokoneellesi. Katso lisätietoja napsauttamalla",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "{protocol}-protokollan ansiosta tämä palvelin on vaivattomasti yhteydessä muihin ({interconnect}).",
"This instance hasn't got push notifications enabled.": "Tämä instanssi ei ole ottanut käyttöön push-ilmoituksia.",
"This instance isn't opened to registrations, but you can register on other instances.": "Tälle palvelimelle ei voi rekisteröityä, mutta voit rekisteröityä muille palvelimille.",
"This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.": "Tämä palvelin, <b>{instanceName} ({domain})</b>, sisältää profiilisi joten älä unohda sen nimeä.",
"This instance isn't opened to registrations, but you can register on other instances.": "Tälle instanssille ei voi rekisteröityä, mutta voit rekisteröityä muille instansseille.",
"This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.": "Tämä instanssi, <b>{instanceName} ({domain})</b>, sisältää profiilisi joten älä unohda sen nimeä.",
"This is a demonstration site to test Mobilizon.": "Tämä on koekäyttöön tarkoitettu Mobilizonin esittelysivu.",
"This is a demonstration site to test the beta version of Mobilizon.": "Tällä esittelysivulla voit koekäyttää Mobilizonin beetaversiota.",
"This is like your federated username (<code>{username}</code>) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "Tämä on ryhmän käyttäjätunnus (<code>{username}</code>) fediversumissa. Sen avulla ryhmä voidaan yksilöidysti löytää muiden palvelinten kautta.",
"This is like your federated username (<code>{username}</code>) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "Tämä on ryhmän käyttäjätunnus (<code>{username}</code>) fediversumissa. Sen avulla ryhmä voidaan yksilöidysti löytää muiden instanssien kautta.",
"This is like your federated username (<code>{username}</code>) for groups. It will allow you to be found on the federation, and is guaranteed to be unique.": "Tämä muistuttaa käyttäjän federaationimeä (<code>{username}</code>) mutta viittaa ryhmään. Se on yksilöllinen, ja sen avulla sinut löydetään federaatiosta.",
"This month": "Tässä kuussa",
"This post is accessible only for members. You have access to it for moderation purposes only because you are an instance moderator.": "Tämä viesti näkyy vain jäsenille. Näet sen vain moderointitarkoituksessa, koska olet instanssisi moderaattori.",
"This setting will be used to display the website and send you emails in the correct language.": "Tämän asetuksen perusteella sinulle näytetään verkkosivu ja lähetetään sähköpostit oikealla kielellä.",
"This user has been disabled": "Käyttäjä on poistettu käytöstä",
"This website isn't moderated and the data that you enter will be automatically destroyed every day at 00:01 (Paris timezone).": "Tätä sivustoa ei moderoida ja kaikki tiedot mitä syötetään tuhotaan automaattisesti joka päivä kello 00:01 (Pariisin aikavyöhyke).",
@ -894,8 +952,12 @@
"To register for an event by choosing one of your identities": "Ilmoittautuaksesi tapahtumiin valitsemalla jokin identiteeteistäsi",
"Today": "Tänään",
"Tomorrow": "Huomenna",
"Tools": "Työkalut",
"Transfer to {outsideDomain}": "Siirry osoitteeseen {outsideDomain}",
"Triggered profile refreshment": "Profiilin päivitys aloitettu",
"Twitch live": "Twitch-lähetys",
"Twitch replay": "Twitch-uudelleentoisto",
"Twitter account": "Twitter-tili",
"Type": "Tyyppi",
"Type or select a date…": "Syötä tai valitse päivämäärä…",
"URL": "URL",
@ -907,7 +969,7 @@
"Unable to load event for participation. The error details are provided below:": "Tapahtumaa ei voi ladata osallistumista varten. Tarkemmat tiedot virheestä:",
"Unable to save your participation in this browser.": "Osallistumistasi ei voi tallentaa tässä selaimessa.",
"Unable to update the profile. The avatar picture may be too heavy.": "Profiilia ei voitu päivittää. Profiilikuva saattaa olla liian raskas.",
"Unfortunately, this instance isn't opened to registrations": "Valitettavasti tälle palvelimelle ei voi rekisteröityä",
"Unfortunately, this instance isn't opened to registrations": "Valitettavasti tälle instanssille ei voi rekisteröityä",
"Unfortunately, your participation request was rejected by the organizers.": "Ikävä kyllä järjestäjät hylkäsivät osallistumispyyntösi.",
"Unknown": "Tuntematon",
"Unknown actor": "Tuntematon tekijä",
@ -932,7 +994,9 @@
"User settings": "Käyttäjän asetukset",
"Username": "Käyttäjänimi",
"Users": "Käyttäjät",
"Video Conference": "Videokokous",
"View a reply": "|Näytä vastaus|Näytä {totalReplies} vastausta",
"View account on {hostname} (in a new window)": "Katso tiliä {hostname} (avautuu uuteen ikkunaan)",
"View all": "Näytä kaikki",
"View all discussions": "Näytä kaikki keskustelut",
"View all events": "Näytä kaikki tapahtumat",
@ -944,7 +1008,7 @@
"View everything": "Näytä kaikki",
"View less": "Katso vähemmän",
"View more": "Katso enemmän",
"View page on {hostname} (in a new window)": "Näytä sivu palvelimella {hostname} (uudessa ikkunassa)",
"View page on {hostname} (in a new window)": "Näytä sivu instanssilla {hostname} (uudessa ikkunassa)",
"Visibility was set to an unknown value.": "Näkyvyys asetettiin tuntemattomaan arvoon.",
"Visibility was set to private.": "Näkyvyys asetettiin yksityiseksi.",
"Visibility was set to public.": "Näkyvyys asetettiin julkiseksi.",
@ -959,8 +1023,8 @@
"We just sent an email to {email}": "Lähetimme juuri sähköpostia osoitteeseen {email}",
"We use your timezone to make sure you get notifications for an event at the correct time.": "Aikavyöhyketiedon avulla saat tapahtumailmoitukset oikeaan aikaan.",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Haluamme kehittää <b>digitaalista yhteisomaisuutta</b>, josta jokainen voi tehdä omanlaisensa ja joka kunnioittaa <b>yksityisyyttä ja aktivismia ihan luonnostaan</b>.",
"We will redirect you to your instance in order to interact with this event": "Ohjaamme sinut omalle palvelimellesi, jotta voit osallistua tapahtumaan",
"We will redirect you to your instance in order to interact with this group": "Ohjaamme sinut omalle palvelimellesi voidaksesi toimia tässä ryhmässä",
"We will redirect you to your instance in order to interact with this event": "Ohjaamme sinut omalle instanssillesi, jotta voit osallistua tapahtumaan",
"We will redirect you to your instance in order to interact with this group": "Ohjaamme sinut omalle instanssillesi voidaksesi toimia tässä ryhmässä",
"We wont change the world from Facebook. The tool we dream of, surveillance capitalism corporations wont develop it, as they couldnt profit from it. This is an opportunity to build something better, by taking another approach.": "Maailmaa ei muuteta Facebookissa. Valvontakapitalismia harjoittavat yhtiöt eivät kehitä tarvitsemiamme työkaluja, sillä ne eivät saisi niistä voittoa. Tämä on tilaisuus rakentaa jotakin paljon parempaa uudesta lähtökohdasta.",
"We'll send you an email one hour before the event begins, to be sure you won't forget about it.": "Saat sähköpostimuistutuksen tapahtumasta tuntia ennen sen alkua.",
"We'll use your timezone settings to send a recap of the morning of the event.": "Tapahtumapäivän aamuna lähetetään muistutus, ja siihen hyödynnetään aikavyöhykeasetusta.",
@ -972,7 +1036,11 @@
"Welcome on your administration panel": "Tervetuloa hallintapaneeliin",
"Welcome to Mobilizon, {username}!": "Tervetuloa Mobilizoniin, {username}!",
"What can I do to help?": "Kuinka voin auttaa?",
"Wheelchair accessibility": "Saavutettavuus pyörätuoleille",
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Tässä näkyy tapahtumat, jotka moderaattori on luonut ja liittänyt tähän ryhmään.",
"Whether the event is accessible with a wheelchair": "Onko tapahtuma saavutettavissa pyörätuolilla",
"Whether the event is interpreted in sign language": "Onko tapahtuma tulkattu viittomakielellä",
"Whether the event live video is subtitled": "Onko tapahtuman live-lähetys tekstitetty",
"Who can view this event and participate": "Kuka voi nähdä tapahtuman ja osallistua siihen",
"Who can view this post": "Kuka voi nähdä tämän julkaisun",
"Who published {number} events": "{number} julkaistua tapahtumaa",
@ -992,8 +1060,8 @@
"You are not part of any group": "Et ole yhdenkään ryhmän jäsen",
"You are not part of any group.": "Et kuulu mihinkään ryhmään.",
"You are offline": "Ei verkkoyhteyttä",
"You are participating in this event anonymously": "Osallistut tapahtumaan anonyymisti",
"You are participating in this event anonymously but didn't confirm participation": "Osallistut tapahtumaan anonyymisti, mutta et ole vahvistanut osallistumistasi",
"You are participating in this event anonymously": "Osallistut tapahtumaan nimettömänä",
"You are participating in this event anonymously but didn't confirm participation": "Osallistut tapahtumaan nimettömänä, mutta et ole vahvistanut osallistumistasi",
"You can add tags by hitting the Enter key or by adding a comma": "Voit lisätä tunnisteita painamalla enteriä tai lisäämällä pilkun",
"You can only get invited to groups right now.": "Toistaiseksi ryhmiin pääsee liittymään vain kutsusta.",
"You can pick your timezone into your preferences.": "Voit valita aikavyöhykkeen asetuksistasi.",
@ -1019,7 +1087,7 @@
"You demoted {member} to simple member.": "Alensit käyttäjän {member} roolin yksinkertaiseksi käyttäjäksi.",
"You didn't create or join any event yet": "Et ole vielä luonut tapahtumaa tai liittynyt tapahtumaan",
"You didn't create or join any event yet.": "Et ole vielä luonut tapahtumaa tai liittynyt mihinkään tapahtumaan.",
"You don't follow any instances yet.": "Et seuraa vielä yhtäkään palvelinta.",
"You don't follow any instances yet.": "Et seuraa vielä yhtäkään instanssia.",
"You excluded member {member}.": "Jätit pois käyttäjän {member}.",
"You have been disconnected": "Yhteytesi on katkaistu",
"You have been invited by {invitedBy} to the following group:": "{invitedBy} on kutsunut sinut seuraaviin ryhmiin:",
@ -1061,7 +1129,7 @@
"You were promoted to an unknown role by {profile}.": "{profile} ylensi sinut tuntemattomaan rooliin.",
"You were promoted to moderator by {profile}.": "{profile} ylensi sinut moderaattoriksi.",
"You will be able to add an avatar and set other options in your account settings.": "Voit lisätä profiilikuvan ja antaa muita tietoja tunnuksen asetuksissasi.",
"You will be redirected to the original instance": "Sinut ohjataan alkuperäiselle palvelimelle",
"You will be redirected to the original instance": "Sinut ohjataan alkuperäiselle instanssille",
"You will find here all the events you have created or of which you are a participant.": "Täällä ovat kaikki luomasi tapahtumat sekä tapahtumat, joihin olet osallistumassa.",
"You wish to participate to the following event": "Haluat osallistua seuraavaan tapahtumaan",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Saat joka maanantai muistutuksen viikon mahdollisista tulevista tapahtumista.",
@ -1069,6 +1137,8 @@
"You'll need to transmit the group URL so people may access the group's profile.": "Ryhmän profiilin näkeminen edellyttää sitä, että jaat ryhmän osoitetta ihmisille.",
"You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Sinun täytyy jakaa linkki ryhmään, jotta käyttäjät voivat päästä ryhmän profiilisivulle. Ryhmä ei näy Mobilizonin haussa tai tavallisilla hakukoneilla.",
"You'll receive a confirmation email.": "Saat sähköpostiin vahvistuksen.",
"YouTube live": "YouTube-lähetys",
"YouTube replay": "YouTube-uudelleentoisto",
"Your account has been successfully deleted": "Tilin poistaminen onnistui",
"Your account has been validated": "Tilisi on vahvistettu",
"Your account is being validated": "Tiliäsi vahvistetaan",
@ -1080,7 +1150,7 @@
"Your email has been changed": "Sähköpostiosoitteesi on vaihdettu",
"Your email is being changed": "Sähköpostiosoitetta vaihdetaan",
"Your email is not whitelisted, you can't register.": "Sähköpostiosoitteesi ei ole hyväksyttyjen luettelossa, et voi rekisteröityä.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Sähköpostiosoitettasi käytetään vain vahvistamaan se, että olet todellinen ihminen, sekä lähettämään mahdollisia päivityksiä tapahtuman tietoihin. Osoitetta EI luovuteta muille palvelimille tai tapahtuman järjestäjälle.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Sähköpostiosoitettasi käytetään vain vahvistamaan se, että olet todellinen ihminen, sekä lähettämään mahdollisia päivityksiä tapahtuman tietoihin. Osoitetta EI luovuteta muille instansseille tai tapahtuman järjestäjälle.",
"Your federated identity": "Identiteettisi fediversumissa",
"Your local administrator resumed its policy:": "Paikallisen ylläpitäjän tiivistys käytännöstään:",
"Your participation has been confirmed": "Osallistumisesi on vahvistettu",
@ -1100,6 +1170,9 @@
"Your timezone was detected as {timezone}.": "Aikavyöhykkeeksesi tunnistettiin {timezone}.",
"Your timezone {timezone} isn't supported.": "Aikavyöhykkeesi {timezone} ei ole tuettu.",
"Your upcoming events": "Tulevat tapahtumasi",
"Zoom": "Zoom",
"Zoom in": "Suurenna",
"Zoom out": "Pienennä",
"[This comment has been deleted by it's author]": "[Kommentin kirjoittaja on poistanut kommentin]",
"[This comment has been deleted]": "[Kommentti on poistettu]",
"[deleted]": "[poistettu]",
@ -1116,6 +1189,7 @@
"default Mobilizon terms": "Mobilizonin oletuskäyttöehdot",
"digital habits of activists": "aktivistien digitaalisiin käytäntöihin",
"e.g. 10 Rue Jangot": "esim. Hämeenkatu 10",
"e.g. Accessibility, Twitch, PeerTube": "esim. Saavutettavuus, Twitch, PeerTube",
"enable the feature": "salli ominaisuus",
"explore the events": "tutustua tapahtumiin",
"explore the groups": "tutustua ryhmiin",
@ -1123,12 +1197,12 @@
"fit the needs and uses of the people": "vastaa ihmisten käyttötarpeita",
"full rules": "säännöt kokonaan",
"iCal Feed": "iCal-syöte",
"instance rules": "palvelimen säännöt",
"instance rules": "Instanssin säännöt",
"interconnect with others like it": "yhdistä muihin samankaltaisiin",
"its source code is public": "sen lähdekoodi on julkinen",
"more than 1360 contributors": "yli 1360 tukijaa",
"on our blog": "blogissamme",
"profile@instance": "profiili@palvelin",
"profile@instance": "profiili@instanssi",
"report #{report_number}": "raportti #{report_number}",
"resend confirmation email": "lähettämään vahvistussähköpostin uudelleen",
"respect of the fundamental freedoms": "perusoikeuksien kunnioittamisen",
@ -1146,7 +1220,7 @@
"{group} activity timeline": "{group} toiminnan aikajana",
"{group} events": "{group} tapahtumat",
"{group}'s events": "Ryhmän {group} tapahtumat",
"{instanceName} is an instance of the {mobilizon} software.": "{instanceName} on {mobilizon}-ohjelmaa käyttävä palvelin.",
"{instanceName} is an instance of the {mobilizon} software.": "{instanceName} on {mobilizon}-ohjelmaa käyttävä instanssi.",
"{instanceName} is an instance of {mobilizon_link}, a free software built with the community.": "{instanceName} on {mobilizon_link} -instanssi, yhteisön luoma vapaa ohjelmisto.",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} varmistaa sitä käyttävien ihmisten {respect}. Koska {source}, kuka tahansa voi tarkastaa sen ja varmistua sen läpinäkyvyydestä.",
"{member} accepted the invitation to join the group.": "{member} hyväksyi liittymiskutsun.",

View File

@ -479,7 +479,7 @@
"My events": "Na tachartasan agam",
"My groups": "Na buidhnean agam",
"My identities": "Na dearbh-aithnean agam",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "AN AIRE! Tha dug neach-lagha sùil air na teirmichean bunaiteach idir agus mar sin chan eil sinn an dùil gun solar iad dìon laghail slàn anns gach suidheachadh do rianaire ionstans a chleachdas iad. Cuideachd, chan eil iad sònraichte do gach dùthaich is uachdranas laghail. Mur eil thu cinnteach, bruidhinn ri neach-lagha.",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "AN AIRE! Cha dug neach-lagha sùil air na teirmichean bunaiteach idir agus mar sin chan eil sinn an dùil gun solar iad dìon laghail slàn anns gach suidheachadh do rianaire ionstans a chleachdas iad. Cuideachd, chan eil iad sònraichte do gach dùthaich is uachdranas laghail. Mur eil thu cinnteach, bruidhinn ri neach-lagha.",
"Name": "Ainm",
"New discussion": "Deasbad ùr",
"New email": "Post-d ùr",

View File

@ -47,6 +47,7 @@ export function deleteUserData(): void {
AUTH_USER_EMAIL,
AUTH_ACCESS_TOKEN,
AUTH_REFRESH_TOKEN,
AUTH_USER_ACTOR_ID,
AUTH_USER_ROLE,
].forEach((key) => {
localStorage.removeItem(key);

View File

@ -394,6 +394,7 @@ import Subtitle from "../components/Utils/Subtitle.vue";
currentUser: CURRENT_USER_CLIENT,
loggedUser: {
query: USER_SETTINGS,
fetchPolicy: "network-only",
skip() {
return !this.currentUser || this.currentUser.isLoggedIn === false;
},

View File

@ -531,6 +531,8 @@ export default class Resources extends Mixins(ResourceMixin) {
variables: {
path: this.actualPath,
username: this.$route.params.preferredUsername,
page: this.page,
limit: this.RESOURCES_PER_PAGE,
},
},
];
@ -620,8 +622,7 @@ export default class Resources extends Mixins(ResourceMixin) {
}
const updatedResource: IResource = data.updateResource;
// eslint-disable-next-line vue/max-len
oldParentCachedResource.children.elements =
const updatedElementList =
oldParentCachedResource.children.elements.filter(
(cachedResource) => cachedResource.id !== updatedResource.id
);
@ -632,7 +633,15 @@ export default class Resources extends Mixins(ResourceMixin) {
path: parentPath,
username: this.resource.actor.preferredUsername,
},
data: { oldParentCachedResource },
data: {
resource: {
...oldParentCachedResource,
children: {
...oldParentCachedResource.children,
elements: [...updatedElementList],
},
},
},
});
console.log("Finished removing ressource from old parent");
@ -657,15 +666,24 @@ export default class Resources extends Mixins(ResourceMixin) {
return;
}
newParentCachedResource.children.elements.push(resource);
store.writeQuery({
query: GET_RESOURCE,
variables: {
path: updatedResource.parent.path,
username: this.resource.actor.preferredUsername,
},
data: { newParentCachedResource },
data: {
resource: {
...newParentCachedResource,
children: {
...newParentCachedResource.children,
elements: [
...newParentCachedResource.children.elements,
resource,
],
},
},
},
});
console.log("Finished adding resource to new parent");
},

View File

@ -381,7 +381,7 @@ export default class Search extends Vue {
set eventPage(page: number) {
this.$router.push({
name: RouteName.SEARCH,
name: this.$route.name || RouteName.SEARCH,
query: { ...this.$route.query, eventPage: page.toString() },
});
}

View File

@ -51,20 +51,22 @@
class="form"
v-if="canChangeEmail"
>
<b-field :label="$t('New email')">
<b-field :label="$t('New email')" label-for="account-email">
<b-input
aria-required="true"
required
type="email"
id="account-email"
v-model="newEmail"
/>
</b-field>
<p class="help">{{ $t("You'll receive a confirmation email.") }}</p>
<b-field :label="$t('Password')">
<b-field :label="$t('Password')" label-for="account-password">
<b-input
aria-required="true"
required
type="password"
id="account-password"
password-reveal
minlength="6"
v-model="passwordForEmailChange"
@ -105,23 +107,25 @@
class="form"
v-if="canChangePassword"
>
<b-field :label="$t('Old password')">
<b-field :label="$t('Old password')" label-for="account-old-password">
<b-input
aria-required="true"
required
type="password"
password-reveal
minlength="6"
id="account-old-password"
v-model="oldPassword"
/>
</b-field>
<b-field :label="$t('New password')">
<b-field :label="$t('New password')" label-for="account-new-password">
<b-input
aria-required="true"
required
type="password"
password-reveal
minlength="6"
id="account-new-password"
v-model="newPassword"
/>
</b-field>
@ -180,14 +184,29 @@
}}
</p>
<form @submit.prevent="deleteAccount">
<b-field v-if="hasUserGotAPassword">
<b-field
:type="deleteAccountPasswordFieldType"
v-if="hasUserGotAPassword"
label-for="account-deletion-password"
>
<b-input
type="password"
v-model="passwordForAccountDeletion"
password-reveal
id="account-deletion-password"
:aria-label="$t('Password')"
icon="lock"
:placeholder="$t('Password')"
/>
<template #message>
<b-message
type="is-danger"
v-for="message in deletePasswordErrors"
:key="message"
>
{{ message }}
</b-message>
</template>
</b-field>
<b-button
native-type="submit"
@ -217,6 +236,7 @@
<script lang="ts">
import { IAuthProvider } from "@/types/enums";
import { GraphQLError } from "graphql/error/GraphQLError";
import { Component, Vue, Ref } from "vue-property-decorator";
import { Route } from "vue-router";
import {
@ -256,6 +276,8 @@ export default class AccountSettings extends Vue {
changePasswordErrors: string[] = [];
deletePasswordErrors: string[] = [];
isDeleteAccountModalActive = false;
passwordForAccountDeletion = "";
@ -313,6 +335,8 @@ export default class AccountSettings extends Vue {
async deleteAccount(): Promise<Route | void> {
try {
this.deletePasswordErrors = [];
console.debug("Asking to delete account...");
await this.$apollo.mutate({
mutation: DELETE_ACCOUNT,
variables: {
@ -321,7 +345,8 @@ export default class AccountSettings extends Vue {
: null,
},
});
await logout(this.$apollo.provider.defaultClient);
console.debug("Deleted account, logging out client...");
await logout(this.$apollo.provider.defaultClient, false);
this.$buefy.notification.open({
message: this.$t(
"Your account has been successfully deleted"
@ -333,7 +358,9 @@ export default class AccountSettings extends Vue {
return await this.$router.push({ name: RouteName.HOME });
} catch (err) {
return this.handleErrors("delete", err);
this.deletePasswordErrors = err.graphQLErrors.map(
({ message }: GraphQLError) => message
);
}
}
@ -361,6 +388,10 @@ export default class AccountSettings extends Vue {
);
}
get deleteAccountPasswordFieldType(): string | null {
return this.deletePasswordErrors.length > 0 ? "is-danger" : null;
}
private handleErrors(type: string, err: any) {
console.error(err);
@ -382,6 +413,12 @@ export default class AccountSettings extends Vue {
</script>
<style lang="scss" scoped>
.modal.is-active.is-full-screen {
.help.is-danger {
font-size: 1rem;
}
}
.cancel-button {
margin-top: 2rem;
}

View File

@ -144,7 +144,11 @@ export default class Preferences extends Vue {
if (this.loggedUser?.settings?.timezone) {
return this.loggedUser.settings.timezone;
}
return Intl.DateTimeFormat().resolvedOptions().timeZone;
const detectedTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
if (this.loggedUser?.settings?.timezone === null) {
this.updateUserSettings({ timezone: detectedTimezone });
}
return detectedTimezone;
}
set selectedTimezone(selectedTimezone: string) {

View File

@ -37,9 +37,9 @@
leven "^3.1.0"
"@apollo/client@^3.0.0", "@apollo/client@^3.3.16":
version "3.4.7"
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.7.tgz#63d7c3539cc45fe44ac9cb093a27641479a8d1ad"
integrity sha512-EmqGxXD8hr05cIFWJFwtGXifc+Lo8hTCEuiaQMtKknHszJfqIFXSxqP+H+eJnjfuoxH74aTSsZKtJlnE83Vt6w==
version "3.4.8"
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.8.tgz#66d06dc1784d07d46731b3bda546046f8c280b74"
integrity sha512-/cNqTSwc2Dw8q6FDDjdd30+yvhP7rI0Fvl3Hbro0lTtFuhzkevfNyQaI2jAiOrjU6Jc0RbanxULaNrX7UmvjSQ==
dependencies:
"@graphql-typed-document-node/core" "^3.0.0"
"@wry/context" "^0.6.0"
@ -997,9 +997,9 @@
minimist "^1.2.0"
"@cypress/request@^2.88.5":
version "2.88.5"
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.5.tgz#8d7ecd17b53a849cfd5ab06d5abe7d84976375d7"
integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==
version "2.88.6"
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.6.tgz#a970dd675befc6bdf8a8921576c01f51cc5798e9"
integrity sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
@ -1014,13 +1014,12 @@
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.19"
oauth-sign "~0.9.0"
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
tough-cookie "~2.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
uuid "^8.3.2"
"@cypress/xvfb@^1.2.4":
version "1.2.4"
@ -1902,14 +1901,14 @@
integrity sha512-rr20mmx41OkWx4q5du2dv2sESR/6xH2tzScUQXwO8SiaQWa6PYTuan1nqBtA76FR9qkVfZY7nwQwZNC9StX/Ww==
"@types/node@*":
version "16.6.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.1.tgz#aee62c7b966f55fc66c7b6dfa1d58db2a616da61"
integrity sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw==
version "16.6.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50"
integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==
"@types/node@^14.14.31":
version "14.17.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.9.tgz#b97c057e6138adb7b720df2bd0264b03c9f504fd"
integrity sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g==
version "14.17.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.10.tgz#93f4b095af275a0427114579c10ec7aa696729d7"
integrity sha512-09x2d6kNBwjHgyh3jOUE2GE4DFoxDriDvWdu6mFhMP1ysynGYazt4ecZmJlL6/fe4Zi2vtYvTvtL7epjQQrBhA==
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
@ -2153,12 +2152,12 @@
integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==
"@typescript-eslint/eslint-plugin@^4.18.0":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz#808d206e2278e809292b5de752a91105da85860b"
integrity sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw==
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.2.tgz#f54dc0a32b8f61c6024ab8755da05363b733838d"
integrity sha512-x4EMgn4BTfVd9+Z+r+6rmWxoAzBaapt4QFqE+d8L8sUtYZYLDTK6VG/y/SMMWA5t1/BVU5Kf+20rX4PtWzUYZg==
dependencies:
"@typescript-eslint/experimental-utils" "4.29.1"
"@typescript-eslint/scope-manager" "4.29.1"
"@typescript-eslint/experimental-utils" "4.29.2"
"@typescript-eslint/scope-manager" "4.29.2"
debug "^4.3.1"
functional-red-black-tree "^1.0.1"
regexpp "^3.1.0"
@ -2176,15 +2175,15 @@
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/experimental-utils@4.29.1":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz#0af2b17b0296b60c6b207f11062119fa9c5a8994"
integrity sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw==
"@typescript-eslint/experimental-utils@4.29.2":
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.2.tgz#5f67fb5c5757ef2cb3be64817468ba35c9d4e3b7"
integrity sha512-P6mn4pqObhftBBPAv4GQtEK7Yos1fz/MlpT7+YjH9fTxZcALbiiPKuSIfYP/j13CeOjfq8/fr9Thr2glM9ub7A==
dependencies:
"@types/json-schema" "^7.0.7"
"@typescript-eslint/scope-manager" "4.29.1"
"@typescript-eslint/types" "4.29.1"
"@typescript-eslint/typescript-estree" "4.29.1"
"@typescript-eslint/scope-manager" "4.29.2"
"@typescript-eslint/types" "4.29.2"
"@typescript-eslint/typescript-estree" "4.29.2"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
@ -2200,32 +2199,32 @@
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/parser@^4.18.0":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.1.tgz#17dfbb45c9032ffa0fe15881d20fbc2a4bdeb02d"
integrity sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg==
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.2.tgz#1c7744f4c27aeb74610c955d3dce9250e95c370a"
integrity sha512-WQ6BPf+lNuwteUuyk1jD/aHKqMQ9jrdCn7Gxt9vvBnzbpj7aWEf+aZsJ1zvTjx5zFxGCt000lsbD9tQPEL8u6g==
dependencies:
"@typescript-eslint/scope-manager" "4.29.1"
"@typescript-eslint/types" "4.29.1"
"@typescript-eslint/typescript-estree" "4.29.1"
"@typescript-eslint/scope-manager" "4.29.2"
"@typescript-eslint/types" "4.29.2"
"@typescript-eslint/typescript-estree" "4.29.2"
debug "^4.3.1"
"@typescript-eslint/scope-manager@4.29.1":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz#f25da25bc6512812efa2ce5ebd36619d68e61358"
integrity sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==
"@typescript-eslint/scope-manager@4.29.2":
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.2.tgz#442b0f029d981fa402942715b1718ac7fcd5aa1b"
integrity sha512-mfHmvlQxmfkU8D55CkZO2sQOueTxLqGvzV+mG6S/6fIunDiD2ouwsAoiYCZYDDK73QCibYjIZmGhpvKwAB5BOA==
dependencies:
"@typescript-eslint/types" "4.29.1"
"@typescript-eslint/visitor-keys" "4.29.1"
"@typescript-eslint/types" "4.29.2"
"@typescript-eslint/visitor-keys" "4.29.2"
"@typescript-eslint/types@3.10.1":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727"
integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==
"@typescript-eslint/types@4.29.1":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.1.tgz#94cce6cf7cc83451df03339cda99d326be2feaf5"
integrity sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==
"@typescript-eslint/types@4.29.2":
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.2.tgz#fc0489c6b89773f99109fb0aa0aaddff21f52fcd"
integrity sha512-K6ApnEXId+WTGxqnda8z4LhNMa/pZmbTFkDxEBLQAbhLZL50DjeY0VIDCml/0Y3FlcbqXZrABqrcKxq+n0LwzQ==
"@typescript-eslint/typescript-estree@3.10.1":
version "3.10.1"
@ -2241,13 +2240,13 @@
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/typescript-estree@4.29.1":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz#7b32a25ff8e51f2671ccc6b26cdbee3b1e6c5e7f"
integrity sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==
"@typescript-eslint/typescript-estree@4.29.2":
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.2.tgz#a0ea8b98b274adbb2577100ba545ddf8bf7dc219"
integrity sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg==
dependencies:
"@typescript-eslint/types" "4.29.1"
"@typescript-eslint/visitor-keys" "4.29.1"
"@typescript-eslint/types" "4.29.2"
"@typescript-eslint/visitor-keys" "4.29.2"
debug "^4.3.1"
globby "^11.0.3"
is-glob "^4.0.1"
@ -2261,12 +2260,12 @@
dependencies:
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/visitor-keys@4.29.1":
version "4.29.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz#0615be8b55721f5e854f3ee99f1a714f2d093e5d"
integrity sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==
"@typescript-eslint/visitor-keys@4.29.2":
version "4.29.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.2.tgz#d2da7341f3519486f50655159f4e5ecdcb2cd1df"
integrity sha512-bDgJLQ86oWHJoZ1ai4TZdgXzJxsea3Ee9u9wsTAvjChdj2WLcVsgWYAPeY7RQMn16tKrlQaBnpKv7KBfs4EQag==
dependencies:
"@typescript-eslint/types" "4.29.1"
"@typescript-eslint/types" "4.29.2"
eslint-visitor-keys "^2.0.0"
"@vue/apollo-option@4.0.0-alpha.11":
@ -3389,9 +3388,9 @@ bluebird@^3.1.1, bluebird@^3.7.2:
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
blurhash@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.3.tgz#dc325af7da836d07a0861d830bdd63694382483e"
integrity sha512-yUhPJvXexbqbyijCIE/T2NCXcj9iNPhWmOKbPTuR/cm7Q5snXYIfnVnz6m7MWOXxODMz/Cr3UcVkRdHiuDVRDw==
version "1.1.4"
resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.4.tgz#a7010ceb3019cd2c9809b17c910ebf6175d29244"
integrity sha512-MXIPz6zwYUKayju+Uidf83KhH0vodZfeRl6Ich8Gu+KGl0JgKiFq9LsfqV7cVU5fKD/AotmduZqvOfrGKOfTaA==
body-parser@1.19.0:
version "1.19.0"
@ -3463,15 +3462,15 @@ browser-process-hrtime@^1.0.0:
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.3, browserslist@^4.16.6, browserslist@^4.16.7:
version "4.16.7"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.7.tgz#108b0d1ef33c4af1b587c54f390e7041178e4335"
integrity sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==
version "4.16.8"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0"
integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==
dependencies:
caniuse-lite "^1.0.30001248"
colorette "^1.2.2"
electron-to-chromium "^1.3.793"
caniuse-lite "^1.0.30001251"
colorette "^1.3.0"
electron-to-chromium "^1.3.811"
escalade "^3.1.1"
node-releases "^1.1.73"
node-releases "^1.1.75"
bs-logger@0.x:
version "0.2.6"
@ -3620,7 +3619,7 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001243, caniuse-lite@^1.0.30001248:
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001243, caniuse-lite@^1.0.30001251:
version "1.0.30001251"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85"
integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==
@ -3905,12 +3904,12 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colord@^2.0.1:
colord@^2.0.1, colord@^2.6:
version "2.7.0"
resolved "https://registry.yarnpkg.com/colord/-/colord-2.7.0.tgz#706ea36fe0cd651b585eb142fe64b6480185270e"
integrity sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q==
colorette@^1.2.1, colorette@^1.2.2:
colorette@^1.2.1, colorette@^1.2.2, colorette@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
@ -4069,9 +4068,9 @@ copy-webpack-plugin@^8.0.0:
serialize-javascript "^5.0.1"
core-js-compat@^3.14.0, core-js-compat@^3.16.0, core-js-compat@^3.8.3:
version "3.16.1"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.1.tgz#c44b7caa2dcb94b673a98f27eee1c8312f55bc2d"
integrity sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ==
version "3.16.2"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.2.tgz#442ef1d933ca6fc80859bd5a1db7a3ba716aaf56"
integrity sha512-4lUshXtBXsdmp8cDWh6KKiHUg40AjiuPD3bOWkNVsr1xkAhpUqCjaZ8lB1bKx9Gb5fXcbRbFJ4f4qpRIRTuJqQ==
dependencies:
browserslist "^4.16.7"
semver "7.0.0"
@ -4087,9 +4086,9 @@ core-js@^2.4.0, core-js@^2.5.0:
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.6.4, core-js@^3.8.3:
version "3.16.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.1.tgz#f4485ce5c9f3c6a7cb18fa80488e08d362097249"
integrity sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw==
version "3.16.2"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.2.tgz#3f485822889c7fc48ef463e35be5cc2a4a01a1f4"
integrity sha512-P0KPukO6OjMpjBtHSceAZEWlDD1M2Cpzpg6dBbrjFqFhBHe/BwhxaP820xKOjRn/lZRQirrCusIpLS/n2sgXLQ==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
@ -4152,11 +4151,6 @@ crypto-random-string@^2.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
css-color-names@^0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
css-color-names@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67"
@ -4237,10 +4231,10 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
cssnano-preset-default@^5.1.3:
version "5.1.3"
resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz#caa54183a8c8df03124a9e23f374ab89df5a9a99"
integrity sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==
cssnano-preset-default@^5.1.4:
version "5.1.4"
resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz#359943bf00c5c8e05489f12dd25f3006f2c1cbd2"
integrity sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==
dependencies:
css-declaration-sorter "^6.0.3"
cssnano-utils "^2.0.1"
@ -4254,7 +4248,7 @@ cssnano-preset-default@^5.1.3:
postcss-merge-longhand "^5.0.2"
postcss-merge-rules "^5.0.2"
postcss-minify-font-values "^5.0.1"
postcss-minify-gradients "^5.0.1"
postcss-minify-gradients "^5.0.2"
postcss-minify-params "^5.0.1"
postcss-minify-selectors "^5.1.0"
postcss-normalize-charset "^5.0.1"
@ -4278,11 +4272,11 @@ cssnano-utils@^2.0.1:
integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==
cssnano@^5.0.0, cssnano@^5.0.6:
version "5.0.7"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.7.tgz#e81894bdf31aa01a0ca3d1d0eee47be18f7f3012"
integrity sha512-7C0tbb298hef3rq+TtBbMuezBQ9VrFtrQEsPNuBKNVgWny/67vdRsnq8EoNu7TRjAHURgYvWlRIpCUmcMZkRzw==
version "5.0.8"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.8.tgz#39ad166256980fcc64faa08c9bb18bb5789ecfa9"
integrity sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==
dependencies:
cssnano-preset-default "^5.1.3"
cssnano-preset-default "^5.1.4"
is-resolvable "^1.1.0"
lilconfig "^2.0.3"
yaml "^1.10.2"
@ -4710,10 +4704,10 @@ ejs@^2.6.1:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.3.793:
version "1.3.806"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.806.tgz#21502100f11aead6c501d1cd7f2504f16c936642"
integrity sha512-AH/otJLAAecgyrYp0XK1DPiGVWcOgwPeJBOLeuFQ5l//vhQhwC9u6d+GijClqJAmsHG4XDue81ndSQPohUu0xA==
electron-to-chromium@^1.3.811:
version "1.3.813"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.813.tgz#751a007d71c00faed8b5e9edaf3634c14b9c5a1f"
integrity sha512-YcSRImHt6JZZ2sSuQ4Bzajtk98igQ0iKkksqlzZLzbh4p0OIyJRSvUbsgqfcR8txdfsoYCc4ym306t4p2kP/aw==
emittery@^0.7.1:
version "0.7.2"
@ -4883,7 +4877,7 @@ eslint-config-prettier@^6.0.0:
dependencies:
get-stdin "^6.0.0"
eslint-import-resolver-node@^0.3.5:
eslint-import-resolver-node@^0.3.6:
version "0.3.6"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
@ -4907,25 +4901,25 @@ eslint-plugin-cypress@^2.10.3, eslint-plugin-cypress@^2.11.2:
globals "^11.12.0"
eslint-plugin-import@^2.20.2:
version "2.24.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz#697ffd263e24da5e84e03b282f5fb62251777177"
integrity sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg==
version "2.24.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.1.tgz#64aba8b567a1ba9921d5465586e86c491b8e2135"
integrity sha512-KSFWhNxPH8OGJwpRJJs+Z7I0a13E2iFQZJIvSnCu6KUs4qmgAm3xN9GYBCSoiGWmwA7gERZPXqYQjcoCROnYhQ==
dependencies:
array-includes "^3.1.3"
array.prototype.flat "^1.2.4"
debug "^2.6.9"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.5"
eslint-import-resolver-node "^0.3.6"
eslint-module-utils "^2.6.2"
find-up "^2.0.0"
has "^1.0.3"
is-core-module "^2.4.0"
is-core-module "^2.6.0"
minimatch "^3.0.4"
object.values "^1.1.3"
object.values "^1.1.4"
pkg-up "^2.0.0"
read-pkg-up "^3.0.0"
resolve "^1.20.0"
tsconfig-paths "^3.9.0"
tsconfig-paths "^3.10.1"
eslint-plugin-prettier@^3.3.1:
version "3.4.0"
@ -5369,9 +5363,9 @@ fastest-levenshtein@^1.0.12:
integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
fastq@^1.6.0:
version "1.11.1"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807"
integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==
version "1.12.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.12.0.tgz#ed7b6ab5d62393fb2cc591c853652a5c318bf794"
integrity sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==
dependencies:
reusify "^1.0.4"
@ -5513,9 +5507,9 @@ flush-promises@^1.0.2:
integrity sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==
follow-redirects@^1.0.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
version "1.14.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.2.tgz#cecb825047c00f5e66b142f90fed4f515dec789b"
integrity sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==
for-in@^1.0.2:
version "1.0.2"
@ -5921,11 +5915,6 @@ he@^1.1.0, he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hex-color-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
highlight.js@^10.7.1:
version "10.7.3"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
@ -5953,16 +5942,6 @@ hpack.js@^2.1.6:
readable-stream "^2.0.1"
wbuf "^1.1.0"
hsl-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
hsla-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
html-encoding-sniffer@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
@ -6380,22 +6359,10 @@ is-ci@^3.0.0:
dependencies:
ci-info "^3.1.1"
is-color-stop@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
dependencies:
css-color-names "^0.0.4"
hex-color-regex "^1.1.0"
hsl-regex "^1.0.0"
hsla-regex "^1.0.0"
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
is-core-module@^2.2.0, is-core-module@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491"
integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==
is-core-module@^2.2.0, is-core-module@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19"
integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==
dependencies:
has "^1.0.3"
@ -8037,10 +8004,10 @@ node-notifier@^8.0.0:
uuid "^8.3.0"
which "^2.0.2"
node-releases@^1.1.73:
version "1.1.74"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.74.tgz#e5866488080ebaa70a93b91144ccde06f3c3463e"
integrity sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==
node-releases@^1.1.75:
version "1.1.75"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
nopt@^5.0.0:
version "5.0.0"
@ -8112,11 +8079,6 @@ nwsapi@^2.2.0:
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@ -8173,7 +8135,7 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
object.values@^1.1.3:
object.values@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30"
integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==
@ -8696,13 +8658,13 @@ postcss-minify-font-values@^5.0.1:
dependencies:
postcss-value-parser "^4.1.0"
postcss-minify-gradients@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz#2dc79fd1a1afcb72a9e727bc549ce860f93565d2"
integrity sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==
postcss-minify-gradients@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz#7c175c108f06a5629925d698b3c4cf7bd3864ee5"
integrity sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==
dependencies:
colord "^2.6"
cssnano-utils "^2.0.1"
is-color-stop "^1.1.0"
postcss-value-parser "^4.1.0"
postcss-minify-params@^5.0.1:
@ -9042,9 +9004,9 @@ prosemirror-gapcursor@^1.1.5:
prosemirror-view "^1.0.0"
prosemirror-history@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.1.3.tgz#4f76a1e71db4ef7cdf0e13dec6d8da2aeaecd489"
integrity sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==
version "1.2.0"
resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.2.0.tgz#04cc4df8d2f7b2a46651a2780de191ada6d465ea"
integrity sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ==
dependencies:
prosemirror-state "^1.2.2"
prosemirror-transform "^1.0.0"
@ -9097,9 +9059,9 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor
prosemirror-model "^1.0.0"
prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.19.0:
version "1.19.1"
resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.19.1.tgz#3fe7479c28501da68348b31fb62a02f56d6d96c8"
integrity sha512-Hijrpw5pSkdr8LvN2KK9AxNngdJu9ftZw8gGB6jCk2bYOZ3VsQCehjKn4Chx3LvRiG3IGZMR2m1jWylRjmiwpA==
version "1.19.3"
resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.19.3.tgz#8d9bc91705bcf9cb5ae3b4de2668f73c7b93fa14"
integrity sha512-YP/ZzVwqPPwbHbJi97U2/CeyZ8PIHmLJt0gIhZWP8XfnuBRGG3y+jwLzUoBVmiuoUCy3R6PSB+pOATliGzLfPg==
dependencies:
prosemirror-model "^1.14.3"
prosemirror-state "^1.0.0"
@ -9511,16 +9473,6 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rgb-regex@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
rgba-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@ -9641,9 +9593,9 @@ sass-loader@^12.0.0:
neo-async "^2.6.2"
sass@^1.34.1:
version "1.37.5"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.37.5.tgz#f6838351f7cc814c4fcfe1d9a20e0cabbd1e7b3c"
integrity sha512-Cx3ewxz9QB/ErnVIiWg2cH0kiYZ0FPvheDTVC6BsiEGBTZKKZJ1Gq5Kq6jy3PKtL6+EJ8NIoaBW/RSd2R6cZOA==
version "1.38.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.38.0.tgz#2f3e60a1efdcdc910586fa79dc89d3399a145b4f"
integrity sha512-WBccZeMigAGKoI+NgD7Adh0ab1HUq+6BmyBUEaGxtErbUtWUevEbdgo5EZiJQofLUGcKtlNaO2IdN73AHEua5g==
dependencies:
chokidar ">=3.0.0 <4.0.0"
@ -10646,7 +10598,7 @@ ts-loader@^8.0.17:
micromatch "^4.0.0"
semver "^7.3.4"
tsconfig-paths@^3.9.0:
tsconfig-paths@^3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7"
integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==

View File

@ -94,9 +94,13 @@ defmodule Mobilizon.GraphQL.API.Search do
@spec process_from_username(String.t()) :: Page.t()
defp process_from_username(search) do
case ActivityPubActor.find_or_make_actor_from_nickname(search) do
{:ok, actor} ->
{:ok, %Actor{type: :Group} = actor} ->
%Page{total: 1, elements: [actor]}
# Don't return anything else than groups
{:ok, %Actor{}} ->
%Page{total: 0, elements: []}
{:error, _err} ->
Logger.debug(fn -> "Unable to find or make actor '#{search}'" end)

View File

@ -1,107 +0,0 @@
defmodule Mix.Tasks.Mobilizon.Maintenance.FixUnattachedMediaInBody do
@moduledoc """
Task to reattach media files that were added in event, post or comment bodies without being attached to their entities.
This task should only be run once.
"""
use Mix.Task
import Mix.Tasks.Mobilizon.Common
alias Mobilizon.{Discussions, Events, Medias, Posts}
alias Mobilizon.Discussions.Comment
alias Mobilizon.Events.Event
alias Mobilizon.Posts.Post
alias Mobilizon.Storage.Repo
require Logger
@preferred_cli_env "prod"
# TODO: Remove me in Mobilizon 1.2
@shortdoc "Reattaches inline media from events and posts"
def run([]) do
start_mobilizon()
shell_info("Going to extract pictures from events")
extract_inline_pictures_from_bodies(Event)
shell_info("Going to extract pictures from posts")
extract_inline_pictures_from_bodies(Post)
shell_info("Going to extract pictures from comments")
extract_inline_pictures_from_bodies(Comment)
end
defp extract_inline_pictures_from_bodies(entity) do
Repo.transaction(
fn ->
entity
|> Repo.stream()
|> Stream.map(&extract_pictures(&1))
|> Stream.map(fn {entity, pics} -> save_entity(entity, pics) end)
|> Stream.run()
end,
timeout: :infinity
)
end
defp extract_pictures(entity) do
extracted_pictures = entity |> get_body() |> parse_body() |> get_media_entities_from_urls()
attached_picture = entity |> get_picture() |> get_media_entity_from_media_id()
attached_pictures = [attached_picture] |> Enum.filter(& &1)
{entity, extracted_pictures ++ attached_pictures}
end
defp get_body(%Event{description: description}), do: description
defp get_body(%Post{body: body}), do: body
defp get_body(%Comment{text: text}), do: text
defp get_picture(%Event{picture_id: picture_id}), do: picture_id
defp get_picture(%Post{picture_id: picture_id}), do: picture_id
defp get_picture(%Comment{}), do: nil
defp parse_body(nil), do: []
defp parse_body(body) do
with res <- Regex.scan(~r/<img\s[^>]*?src\s*=\s*['\"]([^'\"]*?)['\"][^>]*?>/, body),
res <- Enum.map(res, fn [_, res] -> res end) do
res
end
end
defp get_media_entities_from_urls(media_urls) do
media_urls
|> Enum.map(fn media_url ->
# We prefer orphan media, but fallback on already attached media just in case
Medias.get_unattached_media_by_url(media_url) || Medias.get_media_by_url(media_url)
end)
|> Enum.filter(& &1)
end
defp get_media_entity_from_media_id(nil), do: nil
defp get_media_entity_from_media_id(media_id) do
Medias.get_media(media_id)
end
defp save_entity(%Event{} = _event, []), do: :ok
defp save_entity(%Event{} = event, media) do
event = Repo.preload(event, [:contacts, :media])
Events.update_event(event, %{media: media})
end
defp save_entity(%Post{} = _post, []), do: :ok
defp save_entity(%Post{} = post, media) do
post = Repo.preload(post, [:media])
Posts.update_post(post, %{media: media})
end
defp save_entity(%Comment{} = _comment, []), do: :ok
defp save_entity(%Comment{} = comment, media) do
comment = Repo.preload(comment, [:media])
Discussions.update_comment(comment, %{media: media})
end
end

View File

@ -64,7 +64,9 @@ defmodule Mix.Tasks.Mobilizon.Media.CleanOrphan do
end
Enum.each(medias, fn media ->
shell_info("ID: #{media.id}, Actor: #{media.actor_id}, URL: #{media.file.url}")
shell_info(
"ID: #{hd(media).id}, Actor: #{hd(media).actor_id}, Deduplicated #{length(media)} times, URL: #{hd(media).file.url}"
)
end)
end

View File

@ -4,6 +4,7 @@ defmodule Mobilizon.Medias do
"""
import Ecto.Query
import Mobilizon.Storage.CustomFunctions
alias Ecto.Multi
@ -40,23 +41,15 @@ defmodule Mobilizon.Medias do
end
@doc """
Get an unattached media by it's URL
Get all media by an URL.
"""
def get_unattached_media_by_url(url) do
@spec get_all_media_by_url(String.t()) :: Media.t() | nil
def get_all_media_by_url(url) do
url
|> String.split("?", parts: 2)
|> hd
|> media_by_url_query()
|> join(:left, [m], e in assoc(m, :events))
|> join(:left, [m], ep in assoc(m, :event_picture))
|> join(:left, [m], p in assoc(m, :posts))
|> join(:left, [m], pp in assoc(m, :posts_picture))
|> join(:left, [m], c in assoc(m, :comments))
|> where([_m, e], is_nil(e.id))
|> where([_m, _e, ep], is_nil(ep.id))
|> where([_m, _e, _ep, p], is_nil(p.id))
|> where([_m, _e, _ep, _p, pp], is_nil(pp.id))
|> where([_m, _e, _ep, _p, _pp, c], is_nil(c.id))
|> limit(1)
|> Repo.one()
|> Repo.all()
end
@doc """
@ -163,7 +156,7 @@ defmodule Mobilizon.Medias do
defp media_by_url_query(url) do
from(
p in Media,
where: fragment("? @> ?", p.file, ~s|{"url": "#{url}"}|)
where: split_part(fragment("file->>'url'"), "?", 1) == ^url
)
end

View File

@ -0,0 +1,10 @@
defmodule Mobilizon.Storage.CustomFunctions do
@moduledoc """
Helper module for custom PostgreSQL functions
"""
defmacro split_part(string, delimiter, position) do
quote do
fragment("split_part(?, ?, ?)", unquote(string), unquote(delimiter), unquote(position))
end
end
end

View File

@ -5,6 +5,7 @@ defmodule Mobilizon.Service.CleanOrphanMedia do
alias Mobilizon.Actors.Actor
alias Mobilizon.Medias
alias Mobilizon.Medias.File
alias Mobilizon.Medias.Media
alias Mobilizon.Storage.Repo
import Ecto.Query
@ -25,8 +26,10 @@ defmodule Mobilizon.Service.CleanOrphanMedia do
if Keyword.get(opts, :dry_run, false) do
{:ok, medias}
else
Enum.each(medias, fn media ->
Medias.delete_media(media, ignore_file_not_found: true)
Enum.each(medias, fn media_list ->
Enum.each(media_list, fn media ->
Medias.delete_media(media, ignore_file_not_found: true)
end)
end)
{:ok, medias}
@ -49,7 +52,7 @@ defmodule Mobilizon.Service.CleanOrphanMedia do
|> Enum.join(" UNION ")
|> (&"NOT EXISTS(#{&1})").()
@spec find_media(Keyword.t()) :: list(Media.t())
@spec find_media(Keyword.t()) :: list(list(Media.t()))
defp find_media(opts) do
default_grace_period =
Mobilizon.Config.get([:instance, :orphan_upload_grace_period_hours], 48)
@ -68,6 +71,38 @@ defmodule Mobilizon.Service.CleanOrphanMedia do
where: fragment(@union_query)
)
Repo.all(query)
query
|> Repo.all()
|> Enum.filter(fn %Media{file: %File{url: url}} ->
is_all_media_orphan?(url, expiration_date)
end)
|> Enum.chunk_by(fn %Media{file: %File{url: url}} ->
url
|> String.split("?", parts: 2)
|> hd
end)
end
def is_all_media_orphan?(url, expiration_date) do
url
|> Medias.get_all_media_by_url()
|> Enum.all?(&is_media_orphan?(&1, expiration_date))
end
@spec is_media_orphan?(Media.t(), DateTime.t()) :: boolean()
def is_media_orphan?(%Media{id: media_id}, expiration_date) do
query =
from(m in Media,
as: :media,
distinct: true,
join: a in Actor,
on: a.id == m.actor_id,
where: m.id == ^media_id,
where: is_nil(a.domain),
where: m.inserted_at < ^expiration_date,
where: fragment(@union_query)
)
Repo.exists?(query)
end
end

View File

@ -62,7 +62,7 @@ defmodule Mobilizon.Service.DateTime do
def calculate_next_day_notification(%Date{} = day, options \\ []) do
compare_to = Keyword.get(options, :compare_to, DateTime.utc_now())
notification_time = Keyword.get(options, :notification_time, ~T[18:00:00])
timezone = Keyword.get(options, :timezone, "Etc/UTC")
timezone = Keyword.get(options, :timezone, "Etc/UTC") || "Etc/UTC"
send_at = DateTime.new!(day, notification_time, timezone)

View File

@ -23,7 +23,7 @@ defmodule Mobilizon.Service.SiteMap do
config = [
store: Sitemapper.FileStore,
store_config: [path: "priv/static"],
store_config: [path: Application.app_dir(:mobilizon, "priv/static")],
sitemap_url: Endpoint.url(),
gzip: false
]

View File

@ -1,7 +1,7 @@
defmodule Mobilizon.Mixfile do
use Mix.Project
@version "1.3.0"
@version "1.3.2"
def project do
[

View File

@ -26,22 +26,22 @@
"earmark": {:hex, :earmark, "1.4.15", "2c7f924bf495ec1f65bd144b355d0949a05a254d0ec561740308a54946a67888", [:mix], [{:earmark_parser, ">= 1.4.13", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "3b1209b85bc9f3586f370f7c363f6533788fb4e51db23aa79565875e7f9999ee"},
"earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"},
"eblurhash": {:hex, :eblurhash, "1.2.0", "ff461979542fcb1bfd428aaba6ee56e544975f6d657aa3dfcf3e314b1d1c2517", [:rebar3], [], "hexpm", "8fa6b740f1630adc0a3e425dbbb4ff92d036e62eb973e7a06676226137a10aa7"},
"ecto": {:hex, :ecto, "3.6.2", "efdf52acfc4ce29249bab5417415bd50abd62db7b0603b8bab0d7b996548c2bc", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "efad6dfb04e6f986b8a3047822b0f826d9affe8e4ebdd2aeedbfcb14fd48884e"},
"ecto": {:hex, :ecto, "3.7.0", "0b250b4aa5a9cdb80252802bd535c54c963e2d83f5bd179a57c093ed0779994b", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a212cecd544a6f3d00921bc3e7545070eb50b9a1454525323027bf07eba1165"},
"ecto_autoslug_field": {:hex, :ecto_autoslug_field, "2.0.1", "2177c1c253f6dd3efd4b56d1cb76104d0a6ef044c6b9a7a0ad6d32665c4111e5", [:mix], [{:ecto, ">= 2.1.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:slugger, ">= 0.2.0", [hex: :slugger, repo: "hexpm", optional: false]}], "hexpm", "a3cc73211f2e75b89a03332183812ebe1ac08be2e25a1df5aa3d1422f92c45c3"},
"ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"},
"ecto_shortuuid": {:hex, :ecto_shortuuid, "0.1.3", "d36aede64edf256e4b769be2ad15a8ad5d9d1ff8ad46befe39e8cb4489abcd05", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:shortuuid, "~> 2.1.1", [hex: :shortuuid, repo: "hexpm", optional: false]}], "hexpm", "d215c8ced7125265de94d55abc696125942caef33439cf281fafded9744a4294"},
"ecto_sql": {:hex, :ecto_sql, "3.6.2", "9526b5f691701a5181427634c30655ac33d11e17e4069eff3ae1176c764e0ba3", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.6.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5ec9d7e6f742ea39b63aceaea9ac1d1773d574ea40df5a53ef8afbd9242fdb6b"},
"ecto_sql": {:hex, :ecto_sql, "3.7.0", "2fcaad4ab0c8d76a5afbef078162806adbe709c04160aca58400d5cbbe8eeac6", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a26135dfa1d99bf87a928c464cfa25bba6535a4fe761eefa56077a4febc60f70"},
"elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"},
"elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"erlsom": {:hex, :erlsom, "1.5.0", "c5a5cdd0ee0e8dca62bcc4b13ff08da24fdefc16ccd8b25282a2fda2ba1be24a", [:rebar3], [], "hexpm", "55a9dbf9cfa77fcfc108bd8e2c4f9f784dea228a8f4b06ea10b684944946955a"},
"eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"},
"ex_cldr": {:hex, :ex_cldr, "2.23.0", "16aa883c3388a0b27485a810ae2a60d815968a473b5315454ebe2b5264e92a80", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.15", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "7c9dad3115e2622a4902390591d9c4a2f7c5333bd73f02a02f7b4190394c7347"},
"ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.15.1", "8d049f56ad87114b0bd0c6f8d0f4bdaa91d688181e256260af61aa9f13c527af", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.19", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.7", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d4ac12a9fd366d51252662b8477a9eb01ccbb77362115ae6dfa0e253ab139de6"},
"ex_cldr": {:hex, :ex_cldr, "2.23.1", "a449fb44d00131b096f0e203da563827f731ceceafce50cf5e756379bf29e32a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.15", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "f7b42cf2d72bd48feda95890447ff7ef3a07d94c572bf9607db0f7d5c5effaf0"},
"ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.15.2", "628ed777cec3355af866411c335a66595d47d9c1883f9b9189af9486899e4ec5", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.19", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.7", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9fb9fd3c53eff011ada5460ffd487d1faa18a539bd210fcc8e9b6149d40a1f2e"},
"ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.11.1", "a6e56209d6f98082cd197aa424333e7a0e38e79253fce9589117719728de4fef", [:mix], [{:ex_cldr, "~> 2.23", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "99e8eb3f48a30127bb11ab70f484c124c9fe5b11bce710c94c53939032b0c58c"},
"ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.9.2", "39820b1b11ba621ea2832137beb726180bb59936db2eda1df2ad9753d3539b2f", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.15", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.19", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "dabd8e6f444c178b63dea8ace09477f503489027c3708785d5f0e58957104d12"},
"ex_cldr_languages": {:hex, :ex_cldr_languages, "0.2.2", "d7dab93272443b70e18e6aef0f62974418baaca3a3b31a66d51921ec1547113c", [:mix], [{:ex_cldr, "~> 2.2 and >= 2.2.1", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "d9cbf4bf643365b0042e774520ddfcbc31618efd5a5383fac98f75149961622c"},
"ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.19.0", "bfefc45b1eda49896eb4d32a36e15efe649827d4fe42422937ee8e14afcd1dfd", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.23", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.11", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "0f4696e6b6c357879aaa0b3ce18f2cfc49666696371a8a3c0f9c5963aad614f4"},
"ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.21.0", "33611f7d86ed2493f77532803fa79c36df4d62704fda61aa4cbd2b8433f3ba3e", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.23", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.11", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "354f6a79b4f0d6d436263e0c92d6a0610dc4c5191c91d200e9edd0e37ac01cdb"},
"ex_doc": {:hex, :ex_doc, "0.25.1", "4b736fa38dc76488a937e5ef2944f5474f3eff921de771b25371345a8dc810bc", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3200b0a69ddb2028365281fbef3753ea9e728683863d8cdaa96580925c891f67"},
"ex_ical": {:hex, :ex_ical, "0.2.0", "4b928b554614704016cc0c9ee226eb854da9327a1cc460457621ceacb1ac29a6", [:mix], [{:timex, "~> 3.1", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "db76473b2ae0259e6633c6c479a5a4d8603f09497f55c88f9ef4d53d2b75befb"},
"ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"},
@ -102,7 +102,7 @@
"oban": {:hex, :oban, "2.8.0", "e44b19a30e30bb983099f55d59749316ff0eaf5dfef4214e1190738176653e50", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2954a2ac418f7cc4217c0772a3dd3a70e2966240583b97f4126a489e1300a573"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
"phoenix": {:hex, :phoenix, "1.5.10", "3ee7d5c17ff9626d72d374d8fc8909bf00f4323fd15549fbe3abbbd38b5299c8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f9c2eaa5a8fe5a412610c6aa84ccdb6f3e92f333d4df7fbaeb0d5a157dbfb48d"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.3.0", "2c69a452c2e0ee8c93345ae1cdc1696ef4877ff9cbb15c305def41960c3c4ebf", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "0ac491924217550c8f42c81c1f390b5d81517d12ceaf9abf3e701156760a848e"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
"phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},

View File

@ -16,9 +16,11 @@ defmodule Mobilizon.GraphQL.API.SearchTest do
test "search an user by username" do
with_mock ActivityPubActor,
find_or_make_actor_from_nickname: fn "toto@domain.tld" -> {:ok, %Actor{id: 42}} end do
assert {:ok, %Page{total: 1, elements: [%Actor{id: 42}]}} ==
Search.search_actors(%{term: "toto@domain.tld"}, 1, 10, :Person)
find_or_make_actor_from_nickname: fn "toto@domain.tld" ->
{:ok, %Actor{id: 42, type: :Group}}
end do
assert {:ok, %Page{total: 1, elements: [%Actor{id: 42, type: :Group}]}} ==
Search.search_actors(%{term: "toto@domain.tld"}, 1, 10, :Group)
assert_called(ActivityPubActor.find_or_make_actor_from_nickname("toto@domain.tld"))
end

View File

@ -16,7 +16,7 @@ defmodule Mobilizon.Service.CleanOrphanMediaTest do
refute is_nil(Medias.get_media(media_id))
refute is_nil(Medias.get_media(media_2_id))
assert {:ok, [found_media]} = CleanOrphanMedia.clean()
assert {:ok, [[found_media]]} = CleanOrphanMedia.clean()
assert found_media.id == media_id
assert is_nil(Medias.get_media(media_id))
@ -31,7 +31,7 @@ defmodule Mobilizon.Service.CleanOrphanMediaTest do
refute is_nil(Medias.get_media(media_id))
refute is_nil(Medias.get_media(media_2_id))
assert {:ok, [found_media]} = CleanOrphanMedia.clean(dry_run: true)
assert {:ok, [[found_media]]} = CleanOrphanMedia.clean(dry_run: true)
assert found_media.id == media_id
refute is_nil(Medias.get_media(media_id))
@ -46,7 +46,7 @@ defmodule Mobilizon.Service.CleanOrphanMediaTest do
refute is_nil(Medias.get_media(media_id))
refute is_nil(Medias.get_media(media_2_id))
assert {:ok, [found_media]} = CleanOrphanMedia.clean(grace_period: 12)
assert {:ok, [[found_media]]} = CleanOrphanMedia.clean(grace_period: 12)
assert found_media.id == media_id
assert is_nil(Medias.get_media(media_id))

View File

@ -280,7 +280,7 @@ defmodule Mobilizon.Factory do
%Mobilizon.Medias.File{
name: "My Media",
url: url,
content_type: "image/png",
content_type: "image/jpg",
size: 13_120
}
end

View File

@ -43,21 +43,22 @@ defmodule Mix.Tasks.Mobilizon.Media.CleanOrphanTest do
test "with media returned" do
media1 = insert(:media)
media2 = insert(:media)
media3 = insert(:media, file: create_file())
with_mock CleanOrphanMedia,
clean: fn [dry_run: true, grace_period: 48] -> {:ok, [media1, media2]} end do
clean: fn [dry_run: true, grace_period: 48] -> {:ok, [[media1, media2], [media3]]} end do
CleanOrphan.run(["--dry-run"])
assert_received {:mix_shell, :info, [output_received]}
assert output_received == "List of files that would have been deleted"
assert_received {:mix_shell, :info, [output_received]}
assert output_received ==
"ID: #{media1.id}, Actor: #{media1.actor_id}, URL: #{media1.file.url}"
"ID: #{media1.id}, Actor: #{media1.actor_id}, Deduplicated 2 times, URL: #{media1.file.url}"
assert_received {:mix_shell, :info, [output_received]}
assert output_received ==
"ID: #{media2.id}, Actor: #{media2.actor_id}, URL: #{media2.file.url}"
"ID: #{media3.id}, Actor: #{media3.actor_id}, Deduplicated 1 times, URL: #{media3.file.url}"
assert_received {:mix_shell, :info, [output_received]}
assert output_received == "2 files would have been deleted"
@ -78,21 +79,22 @@ defmodule Mix.Tasks.Mobilizon.Media.CleanOrphanTest do
test "with media returned" do
media1 = insert(:media)
media2 = insert(:media)
media3 = insert(:media, file: create_file())
with_mock CleanOrphanMedia,
clean: fn [dry_run: false, grace_period: 48] -> {:ok, [media1, media2]} end do
clean: fn [dry_run: false, grace_period: 48] -> {:ok, [[media1, media2], [media3]]} end do
CleanOrphan.run(["--verbose"])
assert_received {:mix_shell, :info, [output_received]}
assert output_received == "List of files that have been deleted"
assert_received {:mix_shell, :info, [output_received]}
assert output_received ==
"ID: #{media1.id}, Actor: #{media1.actor_id}, URL: #{media1.file.url}"
"ID: #{media1.id}, Actor: #{media1.actor_id}, Deduplicated 2 times, URL: #{media1.file.url}"
assert_received {:mix_shell, :info, [output_received]}
assert output_received ==
"ID: #{media2.id}, Actor: #{media2.actor_id}, URL: #{media2.file.url}"
"ID: #{media3.id}, Actor: #{media3.actor_id}, Deduplicated 1 times, URL: #{media3.file.url}"
assert_received {:mix_shell, :info, [output_received]}
assert output_received == "2 files have been deleted"
@ -121,4 +123,29 @@ defmodule Mix.Tasks.Mobilizon.Media.CleanOrphanTest do
end
end
end
defp create_file do
File.cp!("test/fixtures/picture.png", "test/fixtures/picture_tmp.png")
file = %Plug.Upload{
content_type: "image/png",
path: Path.absname("test/fixtures/picture_tmp.png"),
filename: "image.png"
}
{:ok, data} = Mobilizon.Web.Upload.store(file)
%{
content_type: "image/png",
name: "image.png",
url: url
} = data
%Mobilizon.Medias.File{
name: "My Media",
url: url,
content_type: "image/png",
size: 13_120
}
end
end