From 64220dcff45e8b0b150d1cc29a757dfe33cd735e Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 19:59:40 +0200 Subject: [PATCH 1/7] fix ignore static/media --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 1188fd2..babfe43 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,8 @@ !.coveralls.yml # from test projects: -inventory_project/static/ -inventory_project/media/ +/static/ +/media/ *.sqlite3 # Coverage HTML Report files: From 46869b484e8275a673e277b8498d8ed6e9fa8cdf Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 20:00:20 +0200 Subject: [PATCH 2/7] fix CKeditor --- inventory_project/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inventory_project/settings.py b/inventory_project/settings.py index 4c0246c..cd3873f 100644 --- a/inventory_project/settings.py +++ b/inventory_project/settings.py @@ -138,7 +138,7 @@ DEBUG_TOOLBAR_CONFIG['SHOW_COLLAPSED'] = True # Show toolbar collapsed by defau # _____________________________________________________________________________ # django-ckeditor -CKEDITOR_BASEPATH = STATIC_URL + 'ckeditor/' +CKEDITOR_BASEPATH = STATIC_URL + 'ckeditor/ckeditor/' CKEDITOR_UPLOAD_PATH = 'uploads/' CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename' CKEDITOR_CONFIGS = { From 5d8518b72c2e140aeeffad4b061a472026358fbe Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 20:01:01 +0200 Subject: [PATCH 3/7] print Django version, too --- inventory_project/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/inventory_project/__init__.py b/inventory_project/__init__.py index 9b09076..89b1719 100644 --- a/inventory_project/__init__.py +++ b/inventory_project/__init__.py @@ -4,9 +4,11 @@ import sys +from django import __version__ as django_version + from inventory import __version__ -if __name__ == "inventory_project": - if "--version" not in sys.argv: - print(f"PyInventory v{__version__}") +if __name__ == 'inventory_project': + if '--version' not in sys.argv: + print(f'PyInventory v{__version__} (Django v{django_version})') From 163ce6c8a1d7372c1b1029c87ccfa575109150e0 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 20:07:10 +0200 Subject: [PATCH 4/7] Don't prefix URLs with language_code --- inventory_project/urls.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/inventory_project/urls.py b/inventory_project/urls.py index c80dc46..a718e6d 100644 --- a/inventory_project/urls.py +++ b/inventory_project/urls.py @@ -1,5 +1,4 @@ from django.conf.urls import include, static, url -from django.conf.urls.i18n import i18n_patterns from django.contrib import admin from django.urls import path from django.views.generic import RedirectView @@ -9,13 +8,13 @@ from inventory_project import settings admin.autodiscover() -urlpatterns = i18n_patterns( +urlpatterns = [ # Don't use i18n_patterns() here path('admin/', admin.site.urls), url(r'^$', RedirectView.as_view(url='/admin/')), path('ckeditor/', include('ckeditor_uploader.urls')), # TODO: check permissions? -) +] if settings.DEBUG: urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) From 20d673a0cf9ace5a7358a0e3cece663e7e8f05ef Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 20:20:18 +0200 Subject: [PATCH 5/7] Basic project usage: * Setup Item and Location model * Locations can be nested * Use django-tagulous for item/location tags * Auto assign user to created item/location entries --- inventory/admin/__init__.py | 1 + inventory/admin/base.py | 9 ++++++ inventory/admin/item.py | 4 +-- inventory/admin/location.py | 9 ++++++ inventory/models/__init__.py | 1 + inventory/models/base.py | 25 ++++++++++++++++- inventory/models/item.py | 24 ++++++++++++++-- inventory/models/location.py | 33 ++++++++++++++++++++++ inventory_project/settings.py | 52 +++++++++++++++++------------------ poetry.lock | 21 +++++++++++++- pyproject.toml | 1 + 11 files changed, 147 insertions(+), 33 deletions(-) create mode 100644 inventory/admin/base.py create mode 100644 inventory/admin/location.py diff --git a/inventory/admin/__init__.py b/inventory/admin/__init__.py index 5635118..2f7da51 100644 --- a/inventory/admin/__init__.py +++ b/inventory/admin/__init__.py @@ -1 +1,2 @@ from inventory.admin.item import ItemModelAdmin # noqa +from inventory.admin.location import LocationModelAdmin # noqa diff --git a/inventory/admin/base.py b/inventory/admin/base.py new file mode 100644 index 0000000..8f86bef --- /dev/null +++ b/inventory/admin/base.py @@ -0,0 +1,9 @@ +from reversion_compare.admin import CompareVersionAdmin + + +class BaseUserAdmin(CompareVersionAdmin): + def save_model(self, request, obj, form, change): + if obj.user_id is None: + obj.user = request.user + + super().save_model(request, obj, form, change) diff --git a/inventory/admin/item.py b/inventory/admin/item.py index b15d1e2..eb862c2 100644 --- a/inventory/admin/item.py +++ b/inventory/admin/item.py @@ -1,9 +1,9 @@ from django.contrib import admin -from reversion_compare.admin import CompareVersionAdmin +from inventory.admin.base import BaseUserAdmin from inventory.models import ItemModel @admin.register(ItemModel) -class ItemModelAdmin(CompareVersionAdmin): +class ItemModelAdmin(BaseUserAdmin): pass diff --git a/inventory/admin/location.py b/inventory/admin/location.py new file mode 100644 index 0000000..f652387 --- /dev/null +++ b/inventory/admin/location.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +from inventory.admin.base import BaseUserAdmin +from inventory.models import LocationModel + + +@admin.register(LocationModel) +class LocationModelAdmin(BaseUserAdmin): + pass diff --git a/inventory/models/__init__.py b/inventory/models/__init__.py index 88ee3ef..e46d5a9 100644 --- a/inventory/models/__init__.py +++ b/inventory/models/__init__.py @@ -1 +1,2 @@ from inventory.models.item import ItemModel # noqa +from inventory.models.location import LocationModel # noqa diff --git a/inventory/models/base.py b/inventory/models/base.py index d13193f..d2c107e 100644 --- a/inventory/models/base.py +++ b/inventory/models/base.py @@ -1,8 +1,10 @@ import uuid from bx_py_utils.models.timetracking import TimetrackingBaseModel +from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ +from tagulous.models import TagField class BaseModel(TimetrackingBaseModel): @@ -10,7 +12,28 @@ class BaseModel(TimetrackingBaseModel): primary_key=True, default=uuid.uuid4, editable=False, - verbose_name=_('ID') + verbose_name=_('BaseModel.id.verbose_name'), + help_text=_('BaseModel.id.help_text') + ) + user = models.ForeignKey( # "Owner" of this entry + settings.AUTH_USER_MODEL, + related_name='+', + on_delete=models.CASCADE, + editable=False, # Must be set automatically and never changed + verbose_name=_('BaseModel.user.verbose_name'), + help_text=_('BaseModel.user.help_text') + ) + name = models.CharField( + max_length=255, + verbose_name=_('BaseModel.name.verbose_name'), + help_text=_('BaseModel.name.help_text') + ) + tags = TagField( + blank=True, + force_lowercase=True, + max_count=10, + verbose_name=_('BaseModel.tags.verbose_name'), + help_text=_('BaseModel.tags.help_text') ) class Meta: diff --git a/inventory/models/item.py b/inventory/models/item.py index 80441d1..fef135f 100644 --- a/inventory/models/item.py +++ b/inventory/models/item.py @@ -10,11 +10,29 @@ class ItemModel(BaseModel): A Item that can be described and store somewhere ;) """ description = RichTextUploadingField( - config_name='ItemModel.description' + config_name='ItemModel.description', + verbose_name=_('ItemModel.description.verbose_name'), + help_text=_('ItemModel.description.help_text') ) fcc_id = models.CharField( max_length=20, blank=True, null=True, - verbose_name='FCC ID', - help_text=_('FCC ID-Number for links to: https://fccid.io/') + verbose_name=_('ItemModel.fcc_id.verbose_name'), + help_text=_('ItemModel.fcc_id.help_text') ) + location = models.ForeignKey( + 'inventory.LocationModel', + blank=True, null=True, on_delete=models.SET_NULL, + verbose_name=_('ItemModel.location.verbose_name'), + help_text=_('ItemModel.location.help_text') + ) + + def __str__(self): + if self.location_id is None: + return self.name + else: + return f'{self.name} ({self.location})' + + class Meta: + verbose_name = _('ItemModel.verbose_name') + verbose_name_plural = _('ItemModel.verbose_name_plural') diff --git a/inventory/models/location.py b/inventory/models/location.py index e69de29..a1f0821 100644 --- a/inventory/models/location.py +++ b/inventory/models/location.py @@ -0,0 +1,33 @@ +from ckeditor_uploader.fields import RichTextUploadingField +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from inventory.models.base import BaseModel + + +class LocationModel(BaseModel): + """ + A Storage for items. + """ + description = RichTextUploadingField( + config_name='LocationModel.description', + verbose_name=_('LocationModel.description.verbose_name'), + help_text=_('LocationModel.description.help_text') + ) + parent = models.ForeignKey( + 'self', + on_delete=models.SET_NULL, + blank=True, null=True, + verbose_name=_('LocationModel.parent.verbose_name'), + help_text=_('LocationModel.parent.help_text') + ) + + def __str__(self): + if self.parent_id is None: + return self.name + else: + return f'{self.name} -> {self.parent}' + + class Meta: + verbose_name = _('LocationModel.verbose_name') + verbose_name_plural = _('LocationModel.verbose_name_plural') diff --git a/inventory_project/settings.py b/inventory_project/settings.py index cd3873f..882d1fc 100644 --- a/inventory_project/settings.py +++ b/inventory_project/settings.py @@ -44,6 +44,7 @@ INSTALLED_APPS = ( 'ckeditor', # https://github.com/django-ckeditor/django-ckeditor 'reversion', # https://github.com/etianen/django-reversion 'reversion_compare', # https://github.com/jedie/django-reversion-compare + 'tagulous', # https://github.com/radiac/django-tagulous 'inventory.apps.InventoryConfig', ) @@ -109,7 +110,9 @@ LANGUAGES = [ ('de', _('German')), ('en', _('English')), ] - +LOCALE_PATHS = [ + __Path(BASE_PATH, 'locale') +] USE_I18N = True USE_L10N = True TIME_ZONE = 'Europe/Paris' @@ -117,6 +120,7 @@ USE_TZ = True # _____________________________________________________________________________ # Static files (CSS, JavaScript, Images) + STATIC_URL = '/static/' STATIC_ROOT = str(__Path(BASE_PATH, 'static')) @@ -142,33 +146,20 @@ CKEDITOR_BASEPATH = STATIC_URL + 'ckeditor/ckeditor/' CKEDITOR_UPLOAD_PATH = 'uploads/' CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename' CKEDITOR_CONFIGS = { - # 'ItemModel.description': { - # 'toolbar': 'full', - # 'height': '25em', - # 'width': '100%', - # 'removeButtons': 'Language,Flash,iframes,bidiltr' - # }, 'ItemModel.description': { 'skin': 'moono-lisa', - # 'toolbar_Basic': [['Source', '-', 'Bold', 'Italic']], - # 'toolbar_Full': [ - # [ - # 'Styles', - # 'Format', - # 'Bold', - # 'Italic', - # 'Underline', - # 'Strike', - # 'SpellChecker', - # 'Undo', - # 'Redo', - # ], - # ['Link', 'Unlink', 'Anchor'], - # ['Image', 'Flash', 'Table', 'HorizontalRule'], - # ['TextColor', 'BGColor'], - # ['Smiley', 'SpecialChar'], - # ['Source'], - # ], + 'removeButtons': 'Language', + + # plugins are here: site-packages/ckeditor/static/ckeditor/ckeditor/plugins + 'removePlugins': 'wsc,div,flash,iframe,bidi', + 'toolbar': 'full', + 'height': '25em', + 'width': '100%', + 'filebrowserWindowWidth': 940, + 'filebrowserWindowHeight': 725, + }, + 'LocationModel.description': { + 'skin': 'moono-lisa', 'removeButtons': 'Language', # plugins are here: site-packages/ckeditor/static/ckeditor/ckeditor/plugins @@ -181,6 +172,15 @@ CKEDITOR_CONFIGS = { } } +# _____________________________________________________________________________ +# http://radiac.net/projects/django-tagulous/documentation/installation/#settings + +TAGULOUS_NAME_MAX_LENGTH = 255 +TAGULOUS_SLUG_MAX_LENGTH = 50 +TAGULOUS_LABEL_MAX_LENGTH = TAGULOUS_NAME_MAX_LENGTH +TAGULOUS_SLUG_TRUNCATE_UNIQUE = 5 +TAGULOUS_SLUG_ALLOW_UNICODE = False + # _____________________________________________________________________________ # cut 'pathname' in log output diff --git a/poetry.lock b/poetry.lock index 6988204..990507d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -272,6 +272,22 @@ diff-match-patch = "*" django = ">=2.2,<3.1" django-reversion = "*" +[[package]] +name = "django-tagulous" +version = "1.0.0" +description = "Fabulous Tagging for Django" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +Django = ">=1.11" + +[package.extras] +dev = ["tox", "jasmine"] +devdb = ["psycopg2", "mysqlclient"] +i18n = ["unidecode"] + [[package]] name = "django-tools" version = "0.46.1" @@ -952,7 +968,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pyt [metadata] lock-version = "1.1" python-versions = ">=3.7,<4.0.0" -content-hash = "464ca363f2392ed7c45d131f91148bd1cffb4536f5f88c390d502054d06e95ea" +content-hash = "81bfc3b102483db10838f298a425e9436883c93f06940662e7e7b85b4b9d8308" [metadata.files] appdirs = [ @@ -1139,6 +1155,9 @@ django-reversion-compare = [ {file = "django-reversion-compare-0.12.2.tar.gz", hash = "sha256:9ec6c764a2bcb2be52fa1b4ef4365f8226a89c7b572ab984afe24b76d6247b5f"}, {file = "django_reversion_compare-0.12.2-py3-none-any.whl", hash = "sha256:5ce8d402add477a3c38aae8335af22b3abdfffa83ef5333c06c865abb89e9cbd"}, ] +django-tagulous = [ + {file = "django-tagulous-1.0.0.tar.gz", hash = "sha256:9b4fa1773845a1cf33d21b27f9cdafc6f3fe29a480428bdd8f8717e7d4742396"}, +] django-tools = [ {file = "django-tools-0.46.1.tar.gz", hash = "sha256:0a289c230d908417a0a72d1a7884ebc0508894b1ac7be888ed333170d4c97291"}, {file = "django_tools-0.46.1-py3-none-any.whl", hash = "sha256:e10c13b382b14ecfb589fd194719d44210a26a542869cbb298e0c2a1ede7f90d"}, diff --git a/pyproject.toml b/pyproject.toml index 34831e3..11a1c61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ django-tools = "*" # https://github.com/jedie/django-tools/ django-reversion-compare = "*" # https://github.com/jedie/django-reversion-compare/ django-ckeditor = "*" # https://github.com/django-ckeditor/django-ckeditor bx_py_utils = "*" # https://github.com/boxine/bx_py_utils +django-tagulous = "*" # https://github.com/radiac/django-tagulous [tool.poetry.dev-dependencies] poetry-publish = "*" # https://github.com/jedie/poetry-publish From 54b5b2a7296ec41b78c3b625b753a60a3877bfa9 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 20:21:04 +0200 Subject: [PATCH 6/7] Add de/en translations --- .gitignore | 1 - Makefile | 4 ++ fill_translations.py | 57 ++++++++++++++++ locale/de/LC_MESSAGES/django.mo | Bin 0 -> 1832 bytes locale/de/LC_MESSAGES/django.po | 115 ++++++++++++++++++++++++++++++++ locale/en/LC_MESSAGES/django.mo | Bin 0 -> 1747 bytes locale/en/LC_MESSAGES/django.po | 115 ++++++++++++++++++++++++++++++++ 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 fill_translations.py create mode 100644 locale/de/LC_MESSAGES/django.mo create mode 100644 locale/de/LC_MESSAGES/django.po create mode 100644 locale/en/LC_MESSAGES/django.mo create mode 100644 locale/en/LC_MESSAGES/django.po diff --git a/.gitignore b/.gitignore index babfe43..85f8e77 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,6 @@ coverage.xml *,cover # Translations -*.mo *.pot # Django stuff: diff --git a/Makefile b/Makefile index 0352da2..b4c5b81 100644 --- a/Makefile +++ b/Makefile @@ -77,6 +77,10 @@ publish: ## Release new version to PyPi run-dev-server: ## Run the django dev server in endless loop. ./manage.sh runserver +messages: ## Make and compile locales message files + ./manage.sh makemessages --all + ./manage.sh compilemessages + run-server: ## Run the gunicorn server in endless loop. poetry run inventory run-server diff --git a/fill_translations.py b/fill_translations.py new file mode 100644 index 0000000..b75d10b --- /dev/null +++ b/fill_translations.py @@ -0,0 +1,57 @@ +""" + Auto fill "verbose_name" translations: + Just copy the model field name as translation. +""" +from pathlib import Path + + +MESSAGE_MAP = { + 'id': 'ID', +} + + +def fill(po_file_path): + old_content = [] + new_content = [] + with po_file_path.open('r') as f: + for line in f: + old_content.append(line) + + if line.startswith('msgid "'): + msgstr = '' + msgid = line[7:-2] + try: + model, attribute, kind = msgid.strip().split('.') + except ValueError: + pass + else: + if kind == 'verbose_name': + if attribute in MESSAGE_MAP: + msgstr = MESSAGE_MAP[attribute] + else: + words = attribute.replace('_', ' ').split(' ') + msgstr = ' '.join(i.capitalize() for i in words) + elif kind == 'help_text': + msgstr = ' ' # "hide" empty "help_text" + + elif (line == 'msgstr ""\n' or line == 'msgstr " "\n') and msgstr: + line = f'msgstr "{msgstr}"\n' + + line = line.replace('Content Tonie', 'Content-Tonie') + new_content.append(line) + + if new_content == old_content: + print('Nothing to do, ok.') + return + + with po_file_path.open('w') as f: + f.write(''.join(new_content)) + + print(f'updated: {po_file_path}') + + +if __name__ == '__main__': + for dir in ('de', 'en'): + print('_' * 100) + print(dir) + fill(Path(f'locale/{dir}/LC_MESSAGES/django.po')) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..70167a1362d30b0f0dea9bcdbbb4bf57b8e28b3f GIT binary patch literal 1832 zcma)*&yN&E6vseDN3_SO*>#;wA7P_zFniQLqWV3T_m-DfG_^{Z66(42FDvg0F-BfXBe& z`-FH6dU!pB(vD!Kb0uz%YLc#7}JDaT>e^2LI2%3iu@$ z{J#N1z3&SBdvFE%k6<{zf58xUCU1B=j8oFur&OQmz+^mvDba zAkRadg&cy+K@LO0{4YR4U!ljaP<~h+!Y*pVYqxZy4x6ep%J&w00 zj%6HOm}UfKCYCb`KQPV+euVAqewJIAiOWTuhfO@&XQI%gTVGn%e$Tm0H9sW5Bbv%V z)~)%NV;`+1(T8ju?yO0btK2u%M{6!sNz~3$7j+D_*FT7^@(mT7qDASsNsU^g7S-{) zK=pT3!CY78Uo{K4>@UuU{ zVv#MiS?B&1UJ~w6q8Q%{Eh+7-Oey8=;I8$Q>x6JKH)V#=X;*4ZXSS40Nao)3@RxOQ z7tR>|mOm@XjHuGa$JDi~c5, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-16 19:49+0200\n" +"PO-Revision-Date: 2020-10-16 19:56+0200\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: Jens Diemer\n" +"Language-Team: \n" +"X-Generator: Poedit 2.3\n" + +#: inventory/models/base.py:15 +msgid "BaseModel.id.verbose_name" +msgstr "ID" + +#: inventory/models/base.py:16 +msgid "BaseModel.id.help_text" +msgstr " " + +#: inventory/models/base.py:23 +msgid "BaseModel.user.verbose_name" +msgstr "Benutzer" + +#: inventory/models/base.py:24 +msgid "BaseModel.user.help_text" +msgstr "Der Benutzer dem dieser Eintrag gehört und verwalten kann (Wird automatisch gesetzt)" + +#: inventory/models/base.py:28 +msgid "BaseModel.name.verbose_name" +msgstr "Name" + +#: inventory/models/base.py:29 +msgid "BaseModel.name.help_text" +msgstr " " + +#: inventory/models/base.py:35 +msgid "BaseModel.tags.verbose_name" +msgstr "Tags" + +#: inventory/models/base.py:36 +msgid "BaseModel.tags.help_text" +msgstr " " + +#: inventory/models/item.py:14 +msgid "ItemModel.description.verbose_name" +msgstr "Beschreibung" + +#: inventory/models/item.py:15 +msgid "ItemModel.description.help_text" +msgstr " " + +#: inventory/models/item.py:20 +msgid "ItemModel.fcc_id.verbose_name" +msgstr "FCC ID" + +#: inventory/models/item.py:21 +msgid "ItemModel.fcc_id.help_text" +msgstr "Eindeutige Nummer der FCC" + +#: inventory/models/item.py:26 +msgid "ItemModel.location.verbose_name" +msgstr "Standort" + +#: inventory/models/item.py:27 +msgid "ItemModel.location.help_text" +msgstr "Wo ist dieser Gegenstand eingelagert?" + +#: inventory/models/item.py:34 +msgid "ItemModel.verbose_name" +msgstr "Gegenstand" + +#: inventory/models/item.py:35 +msgid "ItemModel.verbose_name_plural" +msgstr "Gegenstände" + +#: inventory/models/location.py:14 +msgid "LocationModel.description.verbose_name" +msgstr "Beschreibung" + +#: inventory/models/location.py:15 +msgid "LocationModel.description.help_text" +msgstr " " + +#: inventory/models/location.py:21 +msgid "LocationModel.parent.verbose_name" +msgstr "Übergeordneter Standort" + +#: inventory/models/location.py:22 +msgid "LocationModel.parent.help_text" +msgstr "Standorte können verschachtelt werden. Bsp: Der Karton 12 in Schrank 3" + +#: inventory/models/location.py:29 +msgid "LocationModel.verbose_name" +msgstr "Standort" + +#: inventory/models/location.py:30 +msgid "LocationModel.verbose_name_plural" +msgstr "Standorte" + +#: inventory_project/settings.py:110 +msgid "German" +msgstr "" + +#: inventory_project/settings.py:111 +msgid "English" +msgstr "" diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d8a48c52d41dca07c7b85ef8e88c67b76de59980 GIT binary patch literal 1747 zcma)*NpBM|6vqt|C}A)A{s4g}Fri5WlvKUY1r;v#;j`!#Dsr3i%E>0eQL( z6GrcP#`c3-z(XK`2f-3}1f0%vmFZ71{bi=V1zo-$;3@Doco;mofw5!YRnXO~g3eEa zuHN&^{t7$|{S$Z=`~@Bd`+68V2^K(?Z#vT@cmaEV2D%pBY-9{2**nnbA3&Jc$4vj6 z>0iMr*1u)?nN3aq^WavjUj$v9ArKFn#^mxn0DHlQpvx;jq+s)zJpo<3220>$5D$Be z$;G_~w}4+jm(LB?e`{>U%Pxq^?flR_+YV`sz1fR9zkQJ1kev`$vk$TZ;`-kM*#^l$ z+;Dqv_1#|6ah)46r2-M4`&xE9i``EDJ}|48tkrdA_mt>%Sqy~)74C$zztl_+;t zBuZOv%GATayWXf9ucEMAzT@2$3!!uJ#<&$FDh?C}yaJvpRJc~UJahs2K<*Zo^#-rQ zE@W*GAZpYGuM3TJ_UhnpvT}ap|id zl=Tt~)k2#qr$^yUC>@&;$>zzJk>W5lUq{YKIypjx{$cFMpq|SUajSHRZVG8=EEKWO zE8F!dg2!m{zIQ`Np_`6nC4$gWF+Z4N#3siu-FAN?u?l`DR+$sz{smf`QxqDq(A6TM zNzFpR3Od!x#AQG}mlSh}4@1a!ZZV7^stH2F#2Z${xVS!#qUC;8MMhK@Tm6w(Rfdlm zf@CAEA^EIUaawC)bd*6T-B|0YF!#5llld!4%fqCbL2)UJ6+xcHmw22+I1blPO)XKO ZNTDRZk<=8|0S&TpdNEfn{>qDCe*mLW(7pfw literal 0 HcmV?d00001 diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..b20848d --- /dev/null +++ b/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,115 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-16 19:49+0200\n" +"PO-Revision-Date: 2020-10-16 19:58+0200\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: Jens Diemer\n" +"Language-Team: \n" +"X-Generator: Poedit 2.3\n" + +#: inventory/models/base.py:15 +msgid "BaseModel.id.verbose_name" +msgstr "ID" + +#: inventory/models/base.py:16 +msgid "BaseModel.id.help_text" +msgstr " " + +#: inventory/models/base.py:23 +msgid "BaseModel.user.verbose_name" +msgstr "User" + +#: inventory/models/base.py:24 +msgid "BaseModel.user.help_text" +msgstr "The user who is the owner of this entry and can manage it (will be set automatically)" + +#: inventory/models/base.py:28 +msgid "BaseModel.name.verbose_name" +msgstr "Name" + +#: inventory/models/base.py:29 +msgid "BaseModel.name.help_text" +msgstr " " + +#: inventory/models/base.py:35 +msgid "BaseModel.tags.verbose_name" +msgstr "Tags" + +#: inventory/models/base.py:36 +msgid "BaseModel.tags.help_text" +msgstr " " + +#: inventory/models/item.py:14 +msgid "ItemModel.description.verbose_name" +msgstr "Description" + +#: inventory/models/item.py:15 +msgid "ItemModel.description.help_text" +msgstr " " + +#: inventory/models/item.py:20 +msgid "ItemModel.fcc_id.verbose_name" +msgstr "FCC ID" + +#: inventory/models/item.py:21 +msgid "ItemModel.fcc_id.help_text" +msgstr "Unique number from the FCC" + +#: inventory/models/item.py:26 +msgid "ItemModel.location.verbose_name" +msgstr "Location" + +#: inventory/models/item.py:27 +msgid "ItemModel.location.help_text" +msgstr " " + +#: inventory/models/item.py:34 +msgid "ItemModel.verbose_name" +msgstr "Item" + +#: inventory/models/item.py:35 +msgid "ItemModel.verbose_name_plural" +msgstr "Items" + +#: inventory/models/location.py:14 +msgid "LocationModel.description.verbose_name" +msgstr "Description" + +#: inventory/models/location.py:15 +msgid "LocationModel.description.help_text" +msgstr " " + +#: inventory/models/location.py:21 +msgid "LocationModel.parent.verbose_name" +msgstr "Parent" + +#: inventory/models/location.py:22 +msgid "LocationModel.parent.help_text" +msgstr "Locations can be nested. Example: The box 12 in cupboard 3" + +#: inventory/models/location.py:29 +msgid "LocationModel.verbose_name" +msgstr "Location" + +#: inventory/models/location.py:30 +msgid "LocationModel.verbose_name_plural" +msgstr "Locations" + +#: inventory_project/settings.py:110 +msgid "German" +msgstr "" + +#: inventory_project/settings.py:111 +msgid "English" +msgstr "" From 5b285dbd048e12db758f977d4424591285684034 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 16 Oct 2020 20:30:09 +0200 Subject: [PATCH 7/7] update tests --- inventory_tests/test_admin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inventory_tests/test_admin.py b/inventory_tests/test_admin.py index c023b06..48db912 100644 --- a/inventory_tests/test_admin.py +++ b/inventory_tests/test_admin.py @@ -9,9 +9,9 @@ class AdminAnonymousTests(TestCase): """ def test_login_en(self): - response = self.client.get("/en/admin/", HTTP_ACCEPT_LANGUAGE="en") - self.assertRedirects(response, expected_url="/en/admin/login/?next=/en/admin/") + response = self.client.get("/admin/", HTTP_ACCEPT_LANGUAGE="en") + self.assertRedirects(response, expected_url="/admin/login/?next=/admin/") def test_login_de(self): - response = self.client.get("/de/admin/", HTTP_ACCEPT_LANGUAGE="de") - self.assertRedirects(response, expected_url="/de/admin/login/?next=/de/admin/") + response = self.client.get("/admin/", HTTP_ACCEPT_LANGUAGE="de") + self.assertRedirects(response, expected_url="/admin/login/?next=/admin/")