From ec3386548163ecb7de9ef225bf881fb92a3f01da Mon Sep 17 00:00:00 2001 From: Jean Pilliez Date: Mon, 2 Dec 2019 11:39:08 +0100 Subject: [PATCH 1/6] Enhance lock on non int database key --- locking/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locking/models.py b/locking/models.py index 3679cf6..1b76b17 100644 --- a/locking/models.py +++ b/locking/models.py @@ -84,7 +84,7 @@ class Lock(models.Model): on_delete=models.CASCADE) date_expires = models.DateTimeField() content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.PositiveIntegerField() + object_id = models.CharField(max_length=50, verbose_name=_('Key of locked model')) content_object = GenericForeignKey('content_type', 'object_id') objects = LockingManager() From 2b4b825478134e063df31263a50017d79d5ea7c7 Mon Sep 17 00:00:00 2001 From: Jean Pilliez Date: Mon, 2 Dec 2019 11:46:00 +0100 Subject: [PATCH 2/6] Enhance lock on non int database key --- locking/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locking/models.py b/locking/models.py index 1b76b17..56af622 100644 --- a/locking/models.py +++ b/locking/models.py @@ -84,7 +84,7 @@ class Lock(models.Model): on_delete=models.CASCADE) date_expires = models.DateTimeField() content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.CharField(max_length=50, verbose_name=_('Key of locked model')) + object_id = models.CharField(max_length=50, verbose_name='Key of locked model') content_object = GenericForeignKey('content_type', 'object_id') objects = LockingManager() From 84af55c4239e1715e3707fa1c2221b1b6e4a61f1 Mon Sep 17 00:00:00 2001 From: Jean Pilliez Date: Mon, 2 Dec 2019 12:00:49 +0100 Subject: [PATCH 3/6] Enhance lock on non int database key --- locking/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locking/models.py b/locking/models.py index 56af622..6dd304d 100644 --- a/locking/models.py +++ b/locking/models.py @@ -79,7 +79,7 @@ def get_queryset(self): class Lock(models.Model): - id = models.CharField(max_length=15, primary_key=True) + id = models.CharField(max_length=65, primary_key=True) locked_by = models.ForeignKey(getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), on_delete=models.CASCADE) date_expires = models.DateTimeField() From 34e2ace5db02e83acda1928c18448e27cda6d463 Mon Sep 17 00:00:00 2001 From: Jean Pilliez Date: Mon, 2 Dec 2019 12:17:27 +0100 Subject: [PATCH 4/6] To be used by custom admin view too --- locking/admin.py | 6 +++--- locking/urls.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/locking/admin.py b/locking/admin.py index 9a47b79..0077739 100644 --- a/locking/admin.py +++ b/locking/admin.py @@ -105,7 +105,7 @@ def get_urls(self): urls = super(LockingAdminMixin, self).get_urls() locking_urls = [ # URL For Locking admin form JavaScript - url(r'^locking_form.%s_%s_(?P[0-9]+).js$' % self._model_info, + url(r'^locking_form.%s_%s_(?P[0-9a-f-]+).js$' % self._model_info, self.admin_site.admin_view(self.locking_admin_form_js), name=self.locking_admin_form_js_url_name), @@ -159,7 +159,7 @@ def locking_admin_form_js(self, request, object_id): def locking_admin_form_js_url(self, object_id): """Get the URL for the locking admin form js for a given object_id on this admin""" - return reverse('admin:' + self.locking_admin_form_js_url_name, + return reverse(self.admin_site.name + ':' + self.locking_admin_form_js_url_name, kwargs={'object_id': object_id}) def locking_admin_changelist_js(self, request): @@ -170,7 +170,7 @@ def locking_admin_changelist_js(self, request): def locking_admin_changelist_js_url(self): """Get the URL for the locking admin form js for a given object_id on this admin""" - return reverse('admin:' + self.locking_admin_changelist_js_url_name) + return reverse(self.admin_site.name + ':' + self.locking_admin_changelist_js_url_name) def render_change_form(self, request, context, add=False, obj=None, **kwargs): """If editing an existing object, add form locking media to the media context""" diff --git a/locking/urls.py b/locking/urls.py index ae94e0e..48280bb 100644 --- a/locking/urls.py +++ b/locking/urls.py @@ -10,6 +10,6 @@ url(r'api/lock/(?P[\w-]+)/(?P[\w-]+)/$', LockAPIView.as_view(), name='locking-api'), - url(r'api/lock/(?P[\w-]+)/(?P[\w-]+)/(?P\d+)/$', + url(r'api/lock/(?P[\w-]+)/(?P[\w-]+)/(?P[0-9a-f-]+)/$', LockAPIView.as_view(), name='locking-api'), ] From a779a5ec2970cb63b72f362fe8d21e5e4ab74e19 Mon Sep 17 00:00:00 2001 From: Jean Pilliez Date: Mon, 2 Dec 2019 16:30:37 +0100 Subject: [PATCH 5/6] French translation --- locking/locale/fr/LC_MESSAGES/django.po | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 locking/locale/fr/LC_MESSAGES/django.po diff --git a/locking/locale/fr/LC_MESSAGES/django.po b/locking/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..64a5f08 --- /dev/null +++ b/locking/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,65 @@ +# 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. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-02 16:08+0100\n" +"PO-Revision-Date: 2019-12-02 16:18+0018\n" +"Last-Translator: Jean Pilliez \n" +"Language-Team: fr/)\n" +"Language: fr\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" +"X-Translated-Using: django-rosetta 0.7.14\n" + + + +#: locking/admin.py:20 +#, python-brace-format +msgid "" +"You cannot {action} this object because it is locked by {name} ({email})" +msgstr "" +"Vous ne pouvez {action} cet objet car il est utilisé par {name} ({email})" + +#: locking/admin.py:94 +msgid "Lock" +msgstr "Utilisé" + +#: locking/admin.py:142 +msgid "You are currently editing this" +msgstr "Vous éditez cet objet" + +#: locking/admin.py:143 +msgid "Locked by" +msgstr "Utilisé par" + +#: locking/admin.py:144 +msgid "Take over lock" +msgstr "Outrepasser le blocage" + +#: locking/admin.py:145 +msgid "Form is locked by" +msgstr "Ce formulaire est utilisé par" + +#: locking/admin.py:146 +msgid "Another user has taken your lock of this form" +msgstr "Un autre utilisateur a pris l'usage de ce formulaire." + +#: locking/admin.py:147 +msgid "Are you sure you want to remove this lock?" +msgstr "Etes-vous certain de retirer le blocage d'utilisation ?" + +#: locking/admin.py:148 +msgid "" +"Warning! Due to loss of network connectivity or a server error, you may not " +"be able to submit this form." +msgstr "" +"Attention ! Suite à des erreurs réseaux ou une erreur serveur, la mise à " +"jour de ce formulaire est compromise." \ No newline at end of file From 1aa9762ba4e48ec2e60133510395a289cb592ff0 Mon Sep 17 00:00:00 2001 From: Jean Pilliez Date: Wed, 11 Dec 2019 20:54:25 +0100 Subject: [PATCH 6/6] Missing migrations --- locking/migrations/0002_auto_20191202_1147.py | 18 ++++++++++++++++++ locking/migrations/0003_auto_20191202_1201.py | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 locking/migrations/0002_auto_20191202_1147.py create mode 100644 locking/migrations/0003_auto_20191202_1201.py diff --git a/locking/migrations/0002_auto_20191202_1147.py b/locking/migrations/0002_auto_20191202_1147.py new file mode 100644 index 0000000..8b042d2 --- /dev/null +++ b/locking/migrations/0002_auto_20191202_1147.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-12-02 10:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('locking', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='lock', + name='object_id', + field=models.CharField(max_length=50, verbose_name='Key of locked model'), + ), + ] diff --git a/locking/migrations/0003_auto_20191202_1201.py b/locking/migrations/0003_auto_20191202_1201.py new file mode 100644 index 0000000..52a6a7d --- /dev/null +++ b/locking/migrations/0003_auto_20191202_1201.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-12-02 11:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('locking', '0002_auto_20191202_1147'), + ] + + operations = [ + migrations.AlterField( + model_name='lock', + name='id', + field=models.CharField(max_length=65, primary_key=True, serialize=False), + ), + ]