Skip to content

Commit

Permalink
Translator: Add command to recreate languages
Browse files Browse the repository at this point in the history
TYPE: Feature
LINK: ogc-1873
HINT:
```
onegov-translator --select /translator_directory/schaffhausen create-languages --dry-run
onegov-translator --select /translator_directory/schaffhausen force-delete-languages --dry-run
```
  • Loading branch information
Tschuppi81 authored Oct 15, 2024
1 parent 0d5f068 commit b2870a7
Show file tree
Hide file tree
Showing 3 changed files with 371 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/onegov/core/cli/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def __init__(self, queue_processors: list[SmsQueueProcessor]):
)

def on_moved(self, event: 'FileSystemEvent') -> None:
dest_path = os.path.abspath(event.dest_path) # type:ignore[type-var]
dest_path = os.path.abspath(str(event.dest_path))
assert isinstance(dest_path, str)
for qp in self.queue_processors:
# only one queue processor should match
Expand All @@ -208,7 +208,7 @@ def on_moved(self, event: 'FileSystemEvent') -> None:
# moved. But we should also trigger when new files are created just
# in case this ever changes.
def on_created(self, event: 'FileSystemEvent') -> None:
src_path = os.path.abspath(event.src_path) # type:ignore[type-var]
src_path = os.path.abspath(str(event.src_path))
assert isinstance(src_path, str)
for qp in self.queue_processors:
# only one queue processor should match
Expand Down
234 changes: 232 additions & 2 deletions src/onegov/translator_directory/cli.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import re

import click
import re
import transaction

from onegov.core.cli import command_group
from onegov.translator_directory.collections.translator import (
TranslatorCollection)
from onegov.translator_directory import log
from onegov.translator_directory.models.language import Language
from onegov.translator_directory.models.translator import Translator
from onegov.translator_directory.utils import (
update_drive_distances, geocode_translator_addresses, country_code_to_name)
Expand Down Expand Up @@ -422,3 +422,233 @@ def do_migrate_nationalities(
request.session.flush()

return do_migrate_nationalities


LANGUAGES = (
'Afrikaans',
'Albanisch',
'Amharisch',
'Anyin',
'Arabisch',
'Arabisch (Dialekte)',
'Arabisch (Hocharabisch)',
'Arabisch (Masri)',
'Arabisch (Nahost)',
'Aramäisch',
'Armenisch',
'Aserbaidschanisch',
'Badini',
'Bangla',
'Bengalisch',
'Bilen',
'Bosnisch',
'Bulgarisch',
'Chinesisch',
'Chinesisch (Hokkien)',
'Chinesisch (Mandarin)',
'Dänisch',
'Dari',
'Dari (Afghanistan)',
'Deutsch',
'Diola',
'Edo',
'Englisch',
'Ewe',
'Farsi',
'Farsi (Persisch)',
'Farsi Persisch (Afghanistan Iran)',
'Flämisch',
'Französisch',
'Friesisch',
'Galicisch',
'Gebärdensprache',
'Georgisch',
'Griechisch',
'Gujarati',
'Hebräisch',
'Hindi',
'Ibo',
'Igbo',
'Ijaw',
'Indonesisch',
'Irakisch',
'Iranisch',
'Italienisch',
'Italienisch (Dialekte Süditalien)',
'Itsekiri',
'Japanisch',
'Kabyé',
'Kalabari',
'Kantonesisch',
'Kasachisch',
'Keine schriftlichen Übersetzungen',
'Keine Verdolmetschung',
'Kotokoli',
'Kreolisch',
'Kroatisch',
'Kurdisch',
'Kurdisch (Dialekte)',
'Kurmanci',
'Kyrillisch (Serbien)',
'Lettisch',
'Litauisch',
'Mandarin',
'Mandinka',
'Marathi',
'Marokkanisch',
'Mazedonisch',
'Mina',
'Moldauisch',
'Mongolisch',
'Montenegrinisch',
'Niederländisch',
'Oromo',
'Pakistanisch',
'Panjabi',
'Paschto (Afghanistan, Pakistan)',
'Paschtu',
'Patois',
'Persisch',
'Pidgin',
'Pidgin-Englisch',
'Pidgin-Französisch',
'Pidgin-Nigerianisch',
'Pilipino',
'Polnisch',
'Portugiesisch',
'Portugiesisch (Brasil)',
'Punjabi',
'Rumänisch',
'Russisch',
'Schwedisch',
'Serbisch',
'Serbokroatisch',
'Shandong-Dialekt',
'Shanghai-Dialekt',
'Singhalesisch',
'Slowakisch',
'Somali',
'Sorani',
'Spanisch',
'Suaheli',
'Tadschikisch',
'Tagalog',
'Tamil',
'Tamilisch',
'Telugu',
'Tem',
'Thailändisch',
'Tibetisch',
'Tigrinya',
'Tschechisch',
'Türkisch',
'Türkisch (Dialekte)',
'Turkmenisch',
'Uigurisch',
'Ukrainisch',
'Ungarisch',
'Urdu',
'Usbekisch',
'VG ZG',
'Vietnamesisch',
'Weissrussisch',
'Wolof',
'Yoruba',
'Yue-Chinesisch'
)


@cli.command(name='create-languages', context_settings={'singular': True})
@click.option('--dry-run', is_flag=True, default=False)
def create_languages(
dry_run: bool
) -> 'Callable[[TranslatorAppRequest, TranslatorDirectoryApp], None]':
"""
Create languages for the selected translator schema. Languages get
created if they don't exist to prevent id changes.
This command is useful when new languages were added to the LANGUAGES list.
NOTE: No language will be deleted. If a language is not in the LANGUAGES
list the script will print a message.
Example:
onegov-translator --select /translator_directory/schaffhausen
create-languages --dry-run
"""

def do_create_languages(
request: 'TranslatorAppRequest',
app: 'TranslatorDirectoryApp'
) -> None:
# Compare existing languages
existing = request.session.query(Language).all()
existing_lang_names = [lang.name for lang in existing]
for language in existing:
if language.name not in LANGUAGES:
click.secho(f"Language '{language.name}' is "
f'unknown. You may delete it if not in use from '
f"'/languages'", fg='yellow')

# create languages if not existing (to prevent id changes)
add_count = 0
for language_name in LANGUAGES:
if language_name not in existing_lang_names:
add_count += 1
lang = Language(name=language_name)
request.session.add(lang)
click.secho(f'Inserted {add_count} languages of total '
f'{len(LANGUAGES)}', fg='green')

if dry_run:
transaction.abort()
click.secho('Aborting transaction', fg='yellow')
else:
request.session.flush()

return do_create_languages


@cli.command(name='force-delete-languages',
context_settings={'singular': True})
@click.option('--dry-run', is_flag=True, default=False)
def force_delete_languages(
dry_run: bool
) -> 'Callable[[TranslatorAppRequest, TranslatorDirectoryApp], None]':
"""
This command forcefully deletes all languages from the database and all
references will be lost.
This command is useful after the languages have changed and
assigned a lot for testing.
Example:
onegov-translator --select /translator_directory/schaffhausen
delete-languages --dry-run
"""

def do_delete_languages(
request: 'TranslatorAppRequest',
app: 'TranslatorDirectoryApp'
) -> None:

i = input('Are you sure you want to delete all languages and losing '
'all references to it? [y/N]: ')
if i.lower() != 'y':
transaction.abort()
click.secho('Aborting transaction', fg='yellow')
return

del_count = 0
languages = request.session.query(Language)
for lang in languages:
del_count += 1
request.session.delete(lang)
click.secho(f'Deleted {del_count} languages', fg='green')

if dry_run:
transaction.abort()
click.secho('Aborting transaction', fg='yellow')
else:
request.session.flush()

return do_delete_languages
Loading

0 comments on commit b2870a7

Please sign in to comment.